APM/Assets/Scripting/Robot/OrderProcessor.cs
2025-11-17 15:02:30 +07:00

145 lines
4.3 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Newtonsoft.Json;
using UnityEngine;
public class OrderProcessor
{
private readonly PathVisualizer pathVisualizer;
private readonly PathMover pathMover;
private readonly Transform transform;
private string currentMapId;
private readonly string serialNumber;
private string lastNodeId;
private string orderId;
private int lastNodeSequenceId;
private OrderData currentOrder;
private readonly Queue<OrderData> orderQueue;
private bool isProcessingOrder;
public OrderProcessor(PathVisualizer pathVisualizer, PathMover pathMover, Transform transform,
string initialMapId, string serialNumber)
{
this.pathVisualizer = pathVisualizer;
this.pathMover = pathMover;
this.transform = transform;
this.currentMapId = initialMapId;
this.serialNumber = serialNumber;
this.lastNodeId = null;
this.orderId = null;
this.lastNodeSequenceId = 0;
this.currentOrder = null;
this.orderQueue = new Queue<OrderData>();
this.isProcessingOrder = false;
if (pathMover != null)
{
pathMover.OnMoveCompleted += OnMoveCompleted;
}
}
public string CurrentMapId => currentMapId;
public string LastNodeId => lastNodeId;
public string OrderId => orderId;
public int LastNodeSequenceId => lastNodeSequenceId;
public OrderData CurrentOrder => currentOrder;
public string SerialNumber => serialNumber;
public async void ProcessOrderJson(string json)
{
try
{
OrderData order = await Task.Run(() => JsonConvert.DeserializeObject<OrderData>(json));
if (order.SerialNumber != serialNumber)
{
Debug.LogWarning($"SerialNumber trong JSON ({order.SerialNumber}) không khớp với serialNumber của robot ({serialNumber}).");
return;
}
lock (orderQueue)
{
orderQueue.Enqueue(order);
}
if (!isProcessingOrder)
{
UnityMainThreadDispatcher.Enqueue(() => ProcessNextOrder());
}
}
catch (Exception ex)
{
Debug.LogError($"Lỗi khi phân tích JSON: {ex.Message}, SerialNumber: {serialNumber}");
}
}
private void ProcessNextOrder()
{
if (isProcessingOrder)
{
Debug.Log($"Đang xử lý order, không thể bắt đầu order mới. SerialNumber: {serialNumber}");
return;
}
lock (orderQueue)
{
if (orderQueue.Count == 0)
{
Debug.Log($"Hàng đợi order trống. SerialNumber: {serialNumber}");
return;
}
isProcessingOrder = true;
currentOrder = orderQueue.Dequeue();
}
orderId = currentOrder.OrderId;
var lastNode = currentOrder.Nodes.OrderByDescending(n => n.SequenceId).FirstOrDefault();
lastNodeId = lastNode?.NodeId ?? "";
lastNodeSequenceId = lastNode?.SequenceId ?? 0;
string newMapId = currentOrder.Nodes.FirstOrDefault()?.NodePosition.MapId;
if (!string.IsNullOrEmpty(newMapId))
{
currentMapId = newMapId;
}
pathVisualizer.DrawPath(currentOrder.Nodes, currentOrder.Edges);
pathMover.StartMove(currentOrder.Nodes, currentOrder.Edges);
}
private void OnMoveCompleted()
{
Debug.Log($"Hoàn thành order. OrderId: {orderId}, SerialNumber: {serialNumber}");
lastNodeId = "";
orderId = "";
lastNodeSequenceId = 0;
currentOrder = null;
isProcessingOrder = false;
ProcessNextOrder();
}
public void CancelOrder()
{
pathMover.CancelMove();
pathVisualizer.ClearPath();
lastNodeId = "";
orderId = "";
lastNodeSequenceId = 0;
currentOrder = null;
lock (orderQueue)
{
orderQueue.Clear();
Debug.Log($"Đã hủy order hiện tại và xóa hàng đợi. SerialNumber: {serialNumber}");
}
isProcessingOrder = false;
Debug.Log($"Đã hủy nhiệm vụ. SerialNumber: {serialNumber}");
}
}