public static void TransportOrderFailed(TransportOrder ta, string exit_reason) { try { if (ta == null) { return; } log.Error($"order failed : {ta}"); ta.State = TransportOrder.OrderStates.Error; ta.exit_reason = exit_reason; ta.exit_time = DateTime.Now; ta.Update(); // release hooks Main.Database.Execute("UPDATE Rack SET Order_ID=0 WHERE Order_ID=@0", ta.ID); // release trolleys and loading stations Main.Database.Execute("UPDATE Units SET Reserved=0 WHERE Reserved=@0", ta.ID); Main.Database.Execute("UPDATE AGVLocations SET start_wanted=0, confirmation_is_on=0, storage_order_id=0 " + "WHERE storage_order_id=@0", ta.ID); if (ta.LoadingStation != 0) { Main.Database.Execute("UPDATE Units SET barcode='', barcode_bad=0, barcode_ok=0 " + " WHERE Unit_ID >= 11 AND Unit_ID <= 13 and Reserved=@0", ta.ID); } if (ta.IsAgvOrder && ta.MovingInside) { int cnt = Main.Database.Execute("UPDATE StorageOrders SET Status='error', OrderState=@2 " + " WHERE NOT Status IN ('done', 'error', 'timeout') AND AGV_location_machinename=@1 " + " AND ID <> @0 AND rewind_code=@3 AND Target=1 AND Source<>1", ta.ID, ta.AGV_location_machinename, TransportOrder.OrderStates.Error, ta.rewind_code); if (cnt > 0) { log.Warn($"{cnt} other orders canceled, because of failed order {ta.ID} from {ta.SimpleMachineName} to WIP"); } } var mvs = Main.Database.Fetch <MoveOrderEntry>("WHERE NOT Status IN ('done', 'error', 'timeout') AND Order_ID = @0", ta.ID); foreach (var move in mvs) { move.MoveStatus = MoveOrderStatus.error; move.Update(); } var tw = Main.Database.FirstOrDefault <TransportOrder>("WHERE WaitForTransport_ID=@0", ta.ID); if (tw != null) { TransportOrderFailed(tw, "dependent order canceled " + exit_reason); // den auf uns wartenden auch abbrechen } } catch (Exception ex) { log.Error($"Error canceling order {ta}", ex); } }
public dynamic ProcessExternalOrders(dynamic p) { try { var orders = this.Bind <DataList <OrderEntry> >(); if (orders == null) { return(HttpStatusCode.NoContent); } var dborders = Main.Database.Query <TransportOrder>("WHERE ID >= 0"); foreach (OrderEntry item in orders.data) { TransportOrder found = null; foreach (var dbo in dborders) { if (item.id == dbo.ID) { found = dbo; } } log.Debug($"rest got order state {item.OrderState} direction {item.Direction} label {item.Label} job {item.JobNumber} priority {item.Priority} rewind {item.RewindCode}"); if (found == null) { // new order from as400 if (item.OrderState == 1) { TransportOrder dbn = new TransportOrder() { ID = item.id, Priority = item.Priority, // OrderState = item.OrderState, AGV = 0, AGVdest = 0, CylinderState = item.CylinderState, Diameter = item.Diameter, Direction = item.Direction, Label = item.Label ?? "", ItemNumber = item.ItemNumber ?? "", JobNumber = item.JobNumber ?? "", AGV_location_machinename = item.MachineName ?? "", rewind_code = item.RewindCode, manual_mode = item.ManualMode, Inserted = DateTime.UtcNow, LastChange = DateTime.UtcNow, AGVrequested = new DateTime(2000, 1, 1), AGVdone = new DateTime(2000, 1, 1), AGVsource = 0, LSReached = new DateTime(2000, 1, 1), }; dbn.State = TransportOrder.OrderStates.New; if (dbn.manual_mode != 0) { dbn.State = TransportOrder.OrderStates.ManualMode; } if (item.Direction.In(2, 3, 4)) // outgoing { dbn.TransportSource = TransportOrder.Destinations.Storage; dbn.TransportTarget = TransportOrder.Destinations.Press; if (dbn.AGV_location_machinename.ToLowerInvariant().Contains("lam")) { dbn.TransportTarget = TransportOrder.Destinations.Laminator; } // todo more targets var cyl = Cylinder.GetCylinder(item.Label); if (cyl == null || cyl.Cylinder_ID == 0) { dbn.State = TransportOrder.OrderStates.Error; log.Error($"cylinder {item.Label} not found"); } else { dbn.Cylinder_ID = cyl.Cylinder_ID; } } else { dbn.TransportSource = TransportOrder.Destinations.Press; if (dbn.AGV_location_machinename.ToLowerInvariant().Contains("lam")) { dbn.TransportSource = TransportOrder.Destinations.Laminator; } dbn.TransportTarget = TransportOrder.Destinations.Storage; // incoming var cyl = Cylinder.GetCylinder(item.Label); if (cyl == null || cyl.Cylinder_ID == 0) { // unknown diameter var nc = CreateCylinder(item.Label, -1, item.ItemNumber ?? "", item.JobNumber ?? ""); dbn.Cylinder_ID = nc.Cylinder_ID; } else { // already created dbn.Cylinder_ID = cyl.Cylinder_ID; } } dbn.Insert(); } } else { if (item.OrderState == 98) // done -> delete wanted { if (found.Status != "running") { log.Warn($"OrderEntry {found} confirmed (delete)."); found.Delete(); } } else if (item.OrderState == 3) // cancel wanted { if (found.State != TransportOrder.OrderStates.RunningOnTrolley) { if ((found.State == TransportOrder.OrderStates.New || found.State == TransportOrder.OrderStates.ManualMode) && found.AGV == 0) { log.Warn($"OrderEntry {found} canceled."); Logic.OrderManagement.TransportOrderDone(found, "canceled by user"); Main.Database.Execute("Update Units SET BlockForManualOrderUntil = @0 " + "WHERE Unit_ID >= 11 AND Unit_ID <=13 ", DateTime.UtcNow.AddMinutes(BauerLib.Registry.ManuallyBlockMaxMinutes)); } else if (found.MovingInside) { log.Warn($"OrderEntry {found} canceled with error state."); Logic.OrderManagement.TransportOrderFailed(found, "canceled by user"); Main.Database.Execute("Update Units SET BlockForManualOrderUntil = @0 " + "WHERE Unit_ID >= 11 AND Unit_ID <=13 ", DateTime.UtcNow.AddMinutes(BauerLib.Registry.ManuallyBlockMaxMinutes)); } } } else { if (item.Priority != found.Priority) { log.Info($"Priority changed for {item.id} from {found.Priority} to {item.Priority}"); found.Priority = item.Priority; found.Update(); } } } } return(HttpStatusCode.OK); } catch (Exception ex) { log.Error($"Exception processing OrderList ({ex.Message})", ex); log.Error("original POST was:"); log.Error(GetDocumentContents(Request)); } return(HttpStatusCode.BadRequest); }
private void btnRestartOrder_Click(object sender, EventArgs e) { try { if (Program.UserLevel <= UserLevels.USER || restart_job_id == 0) { return; } StopDisplayUpdate(); TransportOrder ta = Main.Database.FirstOrDefault <TransportOrder>("WHERE ID=@0", restart_job_id); if (ta == null) { MessageBox.Show("Order not found", Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Warning); return; } string msg = string.Format(Translate.TranslateString("Do you really want to restart \r\n the order no. {0} ?"), restart_job_id); if (MessageBox.Show(msg, Application.ProductName, MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes) { TransportOrderFailed(ta, "restart by user"); // reload ta = Main.Database.FirstOrDefault <TransportOrder>("WHERE ID = @0", restart_job_id); if (ta.MovingInside) { ta.TargetHook = ""; } // ta.LoadingStation = 0; ta.SourceHook = ""; ta.State = TransportOrder.OrderStates.New; ta.Status = "new"; ta.Trolley = 0; ta.WaitForTransport_ID = 0; ta.Diameter = 0; ta.LSReached = new DateTime(2000, 1, 1); ta.AGV = 0; ta.AGVsource = 0; ta.AGVdest = 0; ta.AGVrequested = new DateTime(2000, 1, 1); ta.AGVdone = new DateTime(2000, 1, 1); ta.Inserted = DateTime.UtcNow; ta.LastChange = DateTime.UtcNow; ta.exit_reason = "restarted"; ta.exit_time = new DateTime(2000, 1, 1); ta.agv_started = false; ta.Update(); log.Warn($"user restarted {ta}"); btnRestartOrder.Tag = 0; btnRestartOrder.Visible = false; } AllowDisplayUpdate(); Program.ResetUserLevel(); } catch (Exception ex) { log.Error("Exception canceling order", ex); } }