diff --git a/Assets/Scripts/UVC/DB/SQLite.cs b/Assets/Scripts/UVC/DB/SQLite.cs index 67cd28ad..01b7c22d 100644 --- a/Assets/Scripts/UVC/DB/SQLite.cs +++ b/Assets/Scripts/UVC/DB/SQLite.cs @@ -223,7 +223,7 @@ namespace SQLite4Unity3d /// var db = new SQLiteConnection(Application.persistentDataPath + "/myDatabase.db", true); /// /// // ̺ - /// db.CreateTable<Person>(); + /// db.CreateTable(); /// /// public SQLiteConnection(string databasePath, bool storeDateTimeAsTicks = false) @@ -438,7 +438,7 @@ namespace SQLite4Unity3d /// /// /// // ׸ Ÿ - /// var mapping = db.GetMapping<Person>(); + /// var mapping = db.GetMapping(); /// /// public TableMapping GetMapping() @@ -466,7 +466,7 @@ namespace SQLite4Unity3d /// /// /// // Person ̺ - /// db.DropTable<Person>(); + /// db.DropTable(); /// /// public int DropTable() @@ -490,10 +490,10 @@ namespace SQLite4Unity3d /// /// /// // Person Ŭ ǥϴ ̺ - /// db.CreateTable<Person>(); + /// db.CreateTable(); /// /// // Ͻ ε ɼ - /// db.CreateTable<Person>(CreateFlags.ImplicitIndex); + /// db.CreateTable(CreateFlags.ImplicitIndex); /// /// public int CreateTable(CreateFlags createFlags = CreateFlags.None) @@ -675,7 +675,7 @@ namespace SQLite4Unity3d /// /// ü Ӽ ε մϴ. - /// : CreateIndex<Client>(c => c.Name); + /// : CreateIndex(c => c.Name); /// /// ͺ̽ ̺ ݿ Ÿ. /// ε Ӽ @@ -683,7 +683,7 @@ namespace SQLite4Unity3d /// /// /// // Ͽ Ӽ ε - /// db.CreateIndex<Person>(p => p.Email, true); + /// db.CreateIndex(p => p.Email, true); /// /// public void CreateIndex(Expression> property, bool unique = false) @@ -821,7 +821,7 @@ namespace SQLite4Unity3d /// /// // ĶͰ ִ /// var cmd = db.CreateCommand("SELECT * FROM Person WHERE Id = ?", 1); - /// var person = cmd.ExecuteQuery<Person>().FirstOrDefault(); + /// var person = cmd.ExecuteQuery().FirstOrDefault(); /// /// public SQLiteCommand CreateCommand(string cmdText, params object[] ps) @@ -897,8 +897,8 @@ namespace SQLite4Unity3d /// /// /// // Į - /// int count = db.ExecuteScalar<int>("SELECT COUNT(*) FROM Person"); - /// string name = db.ExecuteScalar<string>("SELECT Name FROM Person WHERE Id = ?", 1); + /// int count = db.ExecuteScalar("SELECT COUNT(*) FROM Person"); + /// string name = db.ExecuteScalar("SELECT Name FROM Person WHERE Id = ?", 1); /// /// public T ExecuteScalar(string query, params object[] args) @@ -944,7 +944,7 @@ namespace SQLite4Unity3d /// /// /// // ǿ ´ Person ü ȸ - /// var adults = db.Query<Person>("SELECT * FROM Person WHERE Age >= ?", 18); + /// var adults = db.Query("SELECT * FROM Person WHERE Age >= ?", 18); /// foreach (var person in adults) { /// Console.WriteLine($": {person.Name}, {person.Age}"); /// } @@ -975,7 +975,7 @@ namespace SQLite4Unity3d /// /// /// // 뷮 ͸ ε ó - /// var query = db.DeferredQuery<Person>("SELECT * FROM Person"); + /// var query = db.DeferredQuery("SELECT * FROM Person"); /// using (var enumerator = query.GetEnumerator()) { /// while (enumerator.MoveNext()) { /// var person = enumerator.Current; @@ -1061,7 +1061,7 @@ namespace SQLite4Unity3d /// /// /// // LINQ Ͽ ϱ - /// var query = db.Table<Person>() + /// var query = db.Table() /// .Where(p => p.Age > 18) /// .OrderBy(p => p.Name); /// @@ -1091,7 +1091,7 @@ namespace SQLite4Unity3d /// /// // ⺻ Ű Person ü /// try { - /// var person = db.Get<Person>(1); + /// var person = db.Get(1); /// Console.WriteLine($"̸: {person.Name}"); /// } catch (Exception) { /// Console.WriteLine("ش ID Person ã ϴ"); @@ -1118,7 +1118,7 @@ namespace SQLite4Unity3d /// /// // ǽ Person ü /// try { - /// var person = db.Get<Person>(p => p.Email == "test@example.com"); + /// var person = db.Get(p => p.Email == "test@example.com"); /// Console.WriteLine($"̸: {person.Name}"); /// } catch (Exception) { /// Console.WriteLine("ǿ ´ Person ã ϴ"); @@ -1145,7 +1145,7 @@ namespace SQLite4Unity3d /// /// /// // ⺻ Ű Person ü ã ( null ȯ) - /// var person = db.Find<Person>(1); + /// var person = db.Find(1); /// if (person != null) { /// Console.WriteLine($"ãҽϴ: {person.Name}"); /// } else { @@ -1203,7 +1203,7 @@ namespace SQLite4Unity3d /// /// /// // ǽ Person ü ã ( null ȯ) - /// var person = db.Find<Person>(p => p.Email == "test@example.com"); + /// var person = db.Find(p => p.Email == "test@example.com"); /// if (person != null) { /// Console.WriteLine($"ãҽϴ: {person.Name}"); /// } else { @@ -1616,10 +1616,10 @@ namespace SQLite4Unity3d /// // RunInDatabaseLock ͺ̽ /// db.RunInDatabaseLock(() => { /// // ۾ ٸ 忡 ͺ̽ ϴ. - /// var count = db.ExecuteScalar<int>("SELECT COUNT(*) FROM Person"); + /// var count = db.ExecuteScalar("SELECT COUNT(*) FROM Person"); /// /// if (count > 0) { - /// var people = db.Query<Person>("SELECT * FROM Person"); + /// var people = db.Query("SELECT * FROM Person"); /// foreach (var person in people) { /// // ϰ ó /// ProcessPerson(person); @@ -1648,7 +1648,7 @@ namespace SQLite4Unity3d /// /// /// // ü - /// var people = new List<Person> + /// var people = new List /// { /// new Person { Name = "ȫ浿", Age = 30 }, /// new Person { Name = "ö", Age = 25 }, @@ -1687,7 +1687,7 @@ namespace SQLite4Unity3d /// /// /// // ü (浹 ɼ ) - /// var people = new List<Person> + /// var people = new List /// { /// new Person { Id = 1, Name = "ȫ浿", Age = 30 }, /// new Person { Id = 2, Name = "ö", Age = 25 }, @@ -1726,7 +1726,7 @@ namespace SQLite4Unity3d /// /// /// // Ÿ ü - /// var people = new List<object> + /// var people = new List /// { /// new Person { Name = "ȫ浿", Age = 30 }, /// new Person { Name = "ö", Age = 25 } @@ -1798,7 +1798,7 @@ namespace SQLite4Unity3d /// db.InsertOrReplace(new Person { Id = 1, Name = "ȫ浿()", Age = 31 }); /// /// // ü ü ϴ Ʈ - /// var person = db.Get<Person>(1); + /// var person = db.Get(1); /// person.Age += 1; /// db.InsertOrReplace(person); /// @@ -2027,7 +2027,7 @@ namespace SQLite4Unity3d /// /// /// // ͺ̽ ü ˻ - /// var person = db.Get<Person>(1); + /// var person = db.Get(1); /// /// // ü Ӽ /// person.Name = "ȫ浿()"; @@ -2127,7 +2127,7 @@ namespace SQLite4Unity3d /// /// /// // ü Ʈ - /// var people = db.Query<Person>("SELECT * FROM Person WHERE Age < 30"); + /// var people = db.Query("SELECT * FROM Person WHERE Age < 30"); /// foreach (var person in people) { /// person.Age++; /// } @@ -2161,14 +2161,14 @@ namespace SQLite4Unity3d /// /// /// // ͺ̽ ü ˻ - /// var person = db.Get<Person>(1); + /// var person = db.Get(1); /// /// // ü /// int rowsAffected = db.Delete(person); /// Console.WriteLine($" : {rowsAffected}"); /// /// // Ǵ ID - /// rowsAffected = db.Delete<Person>(2); + /// rowsAffected = db.Delete(2); /// /// public int Delete(object objectToDelete) @@ -2198,13 +2198,13 @@ namespace SQLite4Unity3d /// /// /// // ⺻ Ű ü - /// int rowsDeleted = db.Delete<Person>(1); + /// int rowsDeleted = db.Delete(1); /// Console.WriteLine($"ID 1 Person ü {rowsDeleted} "); /// /// // ID ʷ /// int[] idsToDelete = { 2, 3, 4 }; /// foreach (int id in idsToDelete) { - /// db.Delete<Person>(id); + /// db.Delete(id); /// } /// /// @@ -2237,11 +2237,11 @@ namespace SQLite4Unity3d /// db.BeginTransaction(); /// try { /// // Ȯ īƮ - /// int beforeCount = db.ExecuteScalar<int>("SELECT COUNT(*) FROM Person"); + /// int beforeCount = db.ExecuteScalar("SELECT COUNT(*) FROM Person"); /// Console.WriteLine($" : {beforeCount}"); /// /// // Person - /// int deleted = db.DeleteAll<Person>(); + /// int deleted = db.DeleteAll(); /// /// Console.WriteLine($" : {deleted}"); /// db.Commit(); @@ -2272,7 +2272,7 @@ namespace SQLite4Unity3d /// using (var db = new SQLiteConnection("database.db")) /// { /// // ͺ̽ ۾ - /// var people = db.Query<Person>("SELECT * FROM Person"); + /// var people = db.Query("SELECT * FROM Person"); /// /// // using ڵ db.Dispose() ȣ /// } @@ -2282,7 +2282,7 @@ namespace SQLite4Unity3d /// try /// { /// // ۾ - /// connection.CreateTable<Person>(); + /// connection.CreateTable(); /// } /// finally /// { @@ -2312,7 +2312,7 @@ namespace SQLite4Unity3d /// // Ǵ using Ͽ ڵ ݱ /// using (var db = new SQLiteConnection("database.db")) { /// // ͺ̽ ۾ - /// var count = db.ExecuteScalar<int>("SELECT COUNT(*) FROM Person"); + /// var count = db.ExecuteScalar("SELECT COUNT(*) FROM Person"); /// Console.WriteLine($"Person ̺ : {count}"); /// /// // using ڵ db.Dispose() ȣǾ @@ -3454,11 +3454,11 @@ namespace SQLite4Unity3d /// /// /// // ǽ ͸ - /// var adults = db.Table<Person>() + /// var adults = db.Table() /// .Where(p => p.Age >= 18); /// /// // ü̴ - /// var adultMales = db.Table<Person>() + /// var adultMales = db.Table() /// .Where(p => p.Age >= 18) /// .Where(p => p.Gender == ""); /// @@ -3519,10 +3519,10 @@ namespace SQLite4Unity3d /// /// /// // ̼ - /// var peopleByAge = db.Table<Person>().OrderBy(p => p.Age); + /// var peopleByAge = db.Table().OrderBy(p => p.Age); /// /// // ̸ - /// var peopleByName = db.Table<Person>().OrderBy(p => p.Name); + /// var peopleByName = db.Table().OrderBy(p => p.Name); /// /// foreach (var person in peopleByAge) { /// Console.WriteLine($"{person.Name}, {person.Age}"); @@ -3543,10 +3543,10 @@ namespace SQLite4Unity3d /// /// /// // - /// var olderFirst = db.Table<Person>().OrderByDescending(p => p.Age); + /// var olderFirst = db.Table().OrderByDescending(p => p.Age); /// /// // ̸ - /// var reverseAlpha = db.Table<Person>().OrderByDescending(p => p.Name); + /// var reverseAlpha = db.Table().OrderByDescending(p => p.Name); /// /// foreach (var person in olderFirst) { /// Console.WriteLine($"{person.Name}, {person.Age}"); diff --git a/Assets/Scripts/UVC/Data/DataMapper.cs b/Assets/Scripts/UVC/Data/DataMapper.cs index cbb36f3e..c4b8f272 100644 --- a/Assets/Scripts/UVC/Data/DataMapper.cs +++ b/Assets/Scripts/UVC/Data/DataMapper.cs @@ -77,7 +77,7 @@ namespace UVC.Data /// var mapper = new DataMapper(maskJson); /// DataObject result = mapper.Map(sourceJson); /// Debug.Log(result["name"].ToString()); // "김철수" - /// Debug.Log(result["age"].ToObject<int>()); // 30 + /// Debug.Log(result["age"].ToObject()); // 30 /// /// public DataObject Mapping(JObject source) diff --git a/Assets/Scripts/UVC/Data/DataMask.cs b/Assets/Scripts/UVC/Data/DataMask.cs index c3ae7b86..f44ebb3f 100644 --- a/Assets/Scripts/UVC/Data/DataMask.cs +++ b/Assets/Scripts/UVC/Data/DataMask.cs @@ -30,7 +30,7 @@ namespace UVC.Data /// mask.ObjectName = "employees"; // 데이터 객체의 이름 지정 /// /// // 필드 이름 변환 규칙 설정 - /// mask.NamesForReplace = new Dictionary<string, string> + /// mask.NamesForReplace = new Dictionary /// { /// { "full_name", "name" }, // JSON의 full_name을 name으로 변환 /// { "employee_age", "age" } // JSON의 employee_age를 age로 변환 @@ -87,7 +87,7 @@ namespace UVC.Data /// /// /// var mask = new DataMask(); - /// mask.NamesForReplace = new Dictionary<string, string> + /// mask.NamesForReplace = new Dictionary /// { /// { "first_name", "firstName" }, /// { "last_name", "lastName" }, diff --git a/Assets/Scripts/UVC/Data/DataObject.cs b/Assets/Scripts/UVC/Data/DataObject.cs index d34d1b9a..2e7bf746 100644 --- a/Assets/Scripts/UVC/Data/DataObject.cs +++ b/Assets/Scripts/UVC/Data/DataObject.cs @@ -24,7 +24,7 @@ namespace UVC.Data /// mask.ObjectName = "users"; /// /// // 필드 이름 변환 설정 - /// mask.NamesForReplace = new Dictionary<string, string> + /// mask.NamesForReplace = new Dictionary /// { /// { "userName", "name" }, /// { "userEmail", "email" } diff --git a/Assets/Scripts/UVC/Data/MQTTPipeLine.cs b/Assets/Scripts/UVC/Data/MQTTPipeLine.cs index 9405a256..2bd62cdd 100644 --- a/Assets/Scripts/UVC/Data/MQTTPipeLine.cs +++ b/Assets/Scripts/UVC/Data/MQTTPipeLine.cs @@ -4,6 +4,7 @@ using Newtonsoft.Json.Linq; using SampleProject.Config; using System.Collections.Generic; using UVC.network; +using UVC.Tests; namespace UVC.Data { @@ -17,6 +18,16 @@ namespace UVC.Data /// public class MQTTPipeLine { + + /// + /// 테스트를 위한 목업 모드 활성화 여부를 설정하거나 가져옵니다. + /// + /// + /// true로 설정하면 실제 MQTT 요청 대신 MQTTPipeLine를 사용합니다. + /// 테스트 환경에서 외부 의존성 없이 MQTT 통신을 시뮬레이션할 때 유용합니다. + /// + public bool UseMockup { get; internal set; } = false; + /// /// MQTT 브로커의 도메인 주소 /// @@ -37,6 +48,8 @@ namespace UVC.Data /// private MQTTService mqtt; + private MockMQTTService? mockupMQTT; + /// /// MQTTPipeLine 인스턴스를 생성합니다. /// @@ -86,11 +99,24 @@ namespace UVC.Data /// public void Execute() { - foreach (var topic in infoList.Keys) + if (!UseMockup) { - mqtt.AddTopicHandler(topic, OnTopicMessage); + foreach (var topic in infoList.Keys) + { + mqtt.AddTopicHandler(topic, OnTopicMessage); + } + mqtt.Connect(); + } + else + { + // Mockup 모드인 경우 MockMQTTService를 사용하여 테스트 환경을 설정합니다. + mockupMQTT = new MockMQTTService(); + foreach (var topic in infoList.Keys) + { + mockupMQTT.AddTopicHandler(topic, OnTopicMessage); + } + mockupMQTT.Connect(); } - mqtt.Connect(); } /// @@ -141,11 +167,19 @@ namespace UVC.Data /// public void Stop() { - foreach (var topic in infoList.Keys) + if (!UseMockup) { - mqtt.RemoveTopicHandler(topic, OnTopicMessage); + foreach (var topic in infoList.Keys) + { + mqtt.RemoveTopicHandler(topic, OnTopicMessage); + } + mqtt.Disconnect(); + } + else + { + // Mockup 모드인 경우 MockMQTTService를 사용하여 연결을 종료합니다. + mockupMQTT?.Disconnect(); } - mqtt.Disconnect(); } /// @@ -155,7 +189,8 @@ namespace UVC.Data /// 를 호출한 후에는 해당 인스턴스를 더 이상 사용할 수 없습니다. public void Dispose() { - mqtt.Disconnect(); + if (!UseMockup) mqtt.Disconnect(); + else mockupMQTT?.Disconnect(); infoList.Clear(); } diff --git a/Assets/Scripts/UVC/Extention/RectTransformEx.cs b/Assets/Scripts/UVC/Extention/RectTransformEx.cs index 36d551e9..b2522c2e 100644 --- a/Assets/Scripts/UVC/Extention/RectTransformEx.cs +++ b/Assets/Scripts/UVC/Extention/RectTransformEx.cs @@ -20,11 +20,11 @@ namespace UVC.Extension /// /// /// // Ʈ RectTransform - /// RectTransform panelRect = panel.GetComponent<RectTransform>(); + /// RectTransform panelRect = panel.GetComponent(); /// panelRect.SetRectMargin(10f, 10f, 10f, 10f); // 10ȼ /// /// // UI Ҹ θ ̳ʿ ߵ ֱ - /// RectTransform childRect = childObject.GetComponent<RectTransform>(); + /// RectTransform childRect = childObject.GetComponent(); /// childRect.SetRectMargin(5f, 5f, 20f, 5f); // ܿ ū /// /// @@ -44,7 +44,7 @@ namespace UVC.Extension /// /// /// // ư ʺ 200 - /// RectTransform buttonRect = button.GetComponent<RectTransform>(); + /// RectTransform buttonRect = button.GetComponent(); /// buttonRect.SetWidth(200f); /// /// @@ -61,7 +61,7 @@ namespace UVC.Extension /// /// /// // г ̸ 150 - /// RectTransform panelRect = panel.GetComponent<RectTransform>(); + /// RectTransform panelRect = panel.GetComponent(); /// panelRect.SetHeight(150f); /// /// @@ -78,7 +78,7 @@ namespace UVC.Extension /// /// /// // ̹ ũ⸦ 100x100 - /// RectTransform imageRect = image.GetComponent<RectTransform>(); + /// RectTransform imageRect = image.GetComponent(); /// imageRect.SetSize(new Vector2(100f, 100f)); /// /// @@ -95,7 +95,7 @@ namespace UVC.Extension /// /// /// // ư ȭ ߾ӿ ġŰ - /// RectTransform buttonRect = button.GetComponent<RectTransform>(); + /// RectTransform buttonRect = button.GetComponent(); /// buttonRect.SetAnchorsToCenter(); /// buttonRect.anchoredPosition = Vector2.zero; // ߾ ġ ġ /// @@ -114,7 +114,7 @@ namespace UVC.Extension /// /// /// // UI Ҹ ܿ ġŰ - /// RectTransform elementRect = element.GetComponent<RectTransform>(); + /// RectTransform elementRect = element.GetComponent(); /// elementRect.SetAnchorsToTopLeft(); /// elementRect.anchoredPosition = new Vector2(10f, -10f); // ణ ߰ /// @@ -133,7 +133,7 @@ namespace UVC.Extension /// /// /// // ̹ г ü ä - /// RectTransform backgroundRect = backgroundImage.GetComponent<RectTransform>(); + /// RectTransform backgroundRect = backgroundImage.GetComponent(); /// backgroundRect.StretchToParentEdges(); /// /// @@ -150,7 +150,7 @@ namespace UVC.Extension /// /// /// // Ҹ θ ܿ ġ - /// RectTransform elementRect = element.GetComponent<RectTransform>(); + /// RectTransform elementRect = element.GetComponent(); /// elementRect.SetNormalizedPosition(new Vector2(0.95f, 0.95f)); /// /// @@ -177,7 +177,7 @@ namespace UVC.Extension /// /// /// // UI Ұ Ư ǥ ϴ Ȯ - /// RectTransform elementRect = element.GetComponent<RectTransform>(); + /// RectTransform elementRect = element.GetComponent(); /// Rect worldRect = elementRect.GetWorldRect(); /// Vector3 worldPos = Camera.main.ScreenToWorldPoint(Input.mousePosition); /// bool isOverUI = worldRect.Contains(new Vector2(worldPos.x, worldPos.y)); diff --git a/Assets/Scripts/UVC/Extention/SerializableEx.cs b/Assets/Scripts/UVC/Extention/SerializableEx.cs index 31157e77..57f1f504 100644 --- a/Assets/Scripts/UVC/Extention/SerializableEx.cs +++ b/Assets/Scripts/UVC/Extention/SerializableEx.cs @@ -116,7 +116,7 @@ namespace UVC.Extension /// /// // 바이트 배열에서 객체 복원 /// byte[] savedData = GetSavedDataFromSomewhere(); - /// Person restoredPerson = savedData.DeserializeFromBytes<Person>(); + /// Person restoredPerson = savedData.DeserializeFromBytes(); /// /// if (restoredPerson != null) /// { @@ -184,7 +184,7 @@ namespace UVC.Extension /// 역직렬화된 객체 또는 실패 시 null /// /// - /// GameSettings settings = DeserializeFromFile<GameSettings>("Assets/settings.dat"); + /// GameSettings settings = DeserializeFromFile("Assets/settings.dat"); /// if (settings != null) /// { /// ApplySettings(settings.Volume, settings.Difficulty); diff --git a/Assets/Scripts/UVC/Json/JsonHelper.cs b/Assets/Scripts/UVC/Json/JsonHelper.cs index 3e56b579..61d874c3 100644 --- a/Assets/Scripts/UVC/Json/JsonHelper.cs +++ b/Assets/Scripts/UVC/Json/JsonHelper.cs @@ -60,12 +60,12 @@ namespace UVC.Json /// /// // 단일 객체 역직렬화 /// string userJson = "{\"Id\":1,\"Name\":\"홍길동\"}"; - /// User user = JsonHelper.FromJson<User>(userJson); + /// User user = JsonHelper.FromJson(userJson); /// Debug.Log($"사용자 정보: {user.Id}, {user.Name}"); /// /// // 컬렉션 역직렬화 /// string arrayJson = "[{\"Id\":1,\"Name\":\"홍길동\"},{\"Id\":2,\"Name\":\"김철수\"}]"; - /// List<User> users = JsonHelper.FromJson<List<User>>(arrayJson); + /// List users = JsonHelper.FromJson>(arrayJson); /// foreach(var u in users) { /// Debug.Log($"사용자 정보: {u.Id}, {u.Name}"); /// } diff --git a/Assets/Scripts/UVC/Network/MQTTService.cs b/Assets/Scripts/UVC/Network/MQTTService.cs index 7b78e814..c4e253e6 100644 --- a/Assets/Scripts/UVC/Network/MQTTService.cs +++ b/Assets/Scripts/UVC/Network/MQTTService.cs @@ -35,7 +35,6 @@ namespace UVC.network /// 클라이언트가 초기화되고 브로커에 연결된 경우 true를 반환합니다. public bool IsConnected => client != null && client.State == ClientStates.Connected; - private Action onMessageReceived; /// /// MQTTService 인스턴스를 생성합니다. @@ -126,7 +125,7 @@ namespace UVC.network /// /// /// // 핸들러 정의 - /// Action<string, string> temperatureHandler = (topic, message) => { + /// Action temperatureHandler = (topic, message) => { /// Debug.Log($"온도 데이터 수신: {message}"); /// }; /// @@ -324,9 +323,11 @@ namespace UVC.network string payload = Encoding.UTF8.GetString(message.Payload.Data, message.Payload.Offset, message.Payload.Count); Debug.Log($"MQTT OnTopic {topic.Filter.OriginalFilter} => {payload}"); ServerLog.LogMqtt(MQTTDomain, MQTTPort.ToString(), topic.Filter.OriginalFilter, payload, DateTime.Now.ToString("yyyy-MM-ddTHH:mm:ss.fffZ")); - if (onMessageReceived != null) + + if(topicHandler.TryGetValue(topic.Filter.OriginalFilter, out var handler)) { - onMessageReceived.Invoke(topic.Filter.OriginalFilter, payload); + // 등록된 핸들러가 있으면 호출 + handler.Invoke(topic.Filter.OriginalFilter, payload); } } diff --git a/Assets/Scripts/UVC/Tests/Data/MQTTPipeLineTests.cs b/Assets/Scripts/UVC/Tests/Data/MQTTPipeLineTests.cs new file mode 100644 index 00000000..0116a913 --- /dev/null +++ b/Assets/Scripts/UVC/Tests/Data/MQTTPipeLineTests.cs @@ -0,0 +1,602 @@ +#nullable enable + +using Cysharp.Threading.Tasks; +using Newtonsoft.Json.Linq; +using NUnit.Framework; +using System; +using System.Collections.Generic; +using UnityEngine; +using UVC.Data; + +namespace UVC.Tests.Data +{ + [TestFixture] + public class MQTTPipeLineTests + { + private MQTTPipeLine pipeLine; + private Dictionary handlers; + private Dictionary dataMasks; + private readonly string[] topicNames = { "AGV", "CARRIER", "STOCKER_STACK", "ALL" }; + + + [SetUp] + public void Setup() + { + // 기본 테스트 환경 설정 + pipeLine = new MQTTPipeLine("localhost", 1883); + pipeLine.UseMockup = true; // 테스트에서는 항상 MockMQTTService 사용 + + // 핸들러와 데이터 마스크 초기화 + handlers = new Dictionary(); + dataMasks = new Dictionary(); + + // 각 토픽별 핸들러와 데이터 마스크 설정 + foreach (var topic in topicNames) + { + handlers[topic] = new TestDataHandler(); + dataMasks[topic] = CreateDataMaskForTopic(topic); + } + } + + public async UniTask TestAll() + { + Setup(); + Debug.Log("===== MQTTPipeLine 테스트 시작 ====="); + await RunTestAsync(nameof(ExecutePipeLine_AllTopics_RegistersAndHandlesMessages), ExecutePipeLine_AllTopics_RegistersAndHandlesMessages); + await RunTestAsync(nameof(RemoveTopic_ShouldStopReceivingMessages), RemoveTopic_ShouldStopReceivingMessages); + await RunTestAsync(nameof(UpdatedDataOnly_ShouldOnlyCallHandlerForUpdatedData), UpdatedDataOnly_ShouldOnlyCallHandlerForUpdatedData); + await RunTestAsync(nameof(UpdatedDataOnly_WithMockMQTTService_ShouldOnlyReceiveUpdatedData), UpdatedDataOnly_WithMockMQTTService_ShouldOnlyReceiveUpdatedData); + RunTest(nameof(OnTopicMessage_ValidJsonObject_CallsHandler), OnTopicMessage_ValidJsonObject_CallsHandler); + RunTest(nameof(OnTopicMessage_JsonArray_CallsHandler), OnTopicMessage_JsonArray_CallsHandler); + RunTest(nameof(OnTopicMessage_EmptyMessage_DoesNotCallHandler), OnTopicMessage_EmptyMessage_DoesNotCallHandler); + RunTest(nameof(OnTopicMessage_InvalidJson_DoesNotCallHandler), OnTopicMessage_InvalidJson_DoesNotCallHandler); + Debug.Log("===== MQTTPipeLine 테스트 완료 ====="); + } + + private void RunTest(string testName, Action testAction) + { + try + { + Debug.Log($"테스트 시작: {testName}"); + testAction(); + Debug.Log($"테스트 성공: {testName}"); + } + catch (Exception ex) + { + Debug.LogError($"테스트 실패: {testName}\n{ex.Message}\n{ex.StackTrace}"); + } + } + + private async UniTask RunTestAsync(string testName, Func testAction) + { + try + { + Debug.Log($"테스트 시작: {testName}"); + await testAction(); + Debug.Log($"테스트 성공: {testName}"); + } + catch (Exception ex) + { + Debug.LogError($"테스트 실패: {testName}\n{ex.Message}\n{ex.StackTrace}"); + } + } + + [TearDown] + public void TearDown() + { + // 테스트 완료 후 리소스 정리 + pipeLine.Stop(); + pipeLine.Dispose(); + } + + private DataMask CreateDataMaskForTopic(string topic) + { + var dataMask = new DataMask(); + dataMask.ObjectName = topic; + + // 각 토픽별로 ObjectIdKey 설정 + switch (topic) + { + case "AGV": + dataMask.ObjectIdKey = "VHL_NAME"; + dataMask["VHL_NAME"] = "HFF09CNA8013"; + dataMask["AGV_IDX"] = 12; + dataMask["B_INSTALL"] = "Y"; + dataMask["NODE_ID"] = 235; + dataMask["REAL_ID"] = 235; + dataMask["VHL_STATE"] = 11; + dataMask["BAY_LIST"] = "21;"; + dataMask["X"] = 118301; + dataMask["Y"] = 20177; + dataMask["MODE"] = 1; + dataMask["BATT"] = 75; + dataMask["SUB_GOAL"] = 211; + dataMask["FINAL_GOAL"] = 1006; + dataMask["TIMESTAMP"] = "2025-03-25T12:00:00.980Z"; + dataMask["DEGREE"] = 181.2; + dataMask["STOP_STATE"] = 0; + dataMask["JOB_ID"] = "2F24217_289_7038296224059039"; + dataMask["DESTINATION_PORT"] = "HFF09MPI0200_LIP01"; + dataMask["SOURCE_PORT"] = "HFF09AGM0100_UOP01"; + dataMask["FROM"] = "HFF09AGM0100,NULL,0201012"; + dataMask["TO"] = "HFF09MPI0200,HFF09MPI0200_LIP01,NULL"; + dataMask["TRANSPORT_JOB_TIMESTAMP"] = "2025-03-25T05:40:19.000Z"; + dataMask["FACTOR"] = 69.3; + dataMask["AGV_FACTOR_TIMESTAMP"] = DateTime.Now; + break; + case "CARRIER": + dataMask.ObjectIdKey = "MAIN_CARR_ID"; + dataMask["MAIN_CARR_ID"] = "2F02365"; + dataMask["SUB_CARR_ID"] = "2F02365,2F70671,2F28723"; + dataMask["CARR_SEQ"] = "3"; + dataMask["CARR_USE"] = "EMPTY"; + dataMask["CURRENTPORT"] = "HFF09CNV0300_ABP3003"; + dataMask["MOVESTATUS"] = "ARRIVED"; + dataMask["MOVEFLAG"] = "0"; + dataMask["PROD_DETAIL_CODE"] = "E3A"; + dataMask["ASSIGN_LOT_QTY"] = "0"; + dataMask["CARR_SIZE_TYPE"] = "STACK3"; + dataMask["ABNM_VALUE"] = "0"; + dataMask["LINE_ID"] = "FM0I"; + dataMask["TIMESTAMP"] = DateTime.Now; + dataMask["GOOD_QTY"] = "0"; + dataMask["CURRENTLOCATION"] = "HFF09CNV0300"; + break; + case "STOCKER_STACK": + dataMask.ObjectIdKey = "STOCKER_NAME"; + dataMask["STOCKER_NAME"] = "HFF09AGN0300"; + dataMask["CAPACITY"] = "89.57"; + dataMask["MAXIMUM_CAPACITY"] = "834"; + dataMask["TRAY_CAPACITY"] = "83.25"; + dataMask["MAXIMUM_TRAY_CAPACITY"] = "2502"; + dataMask["RACK_LOAD_COUNT"] = "747"; + dataMask["RACK_EMPTY_COUNT"] = "87"; + dataMask["RESERVATED_RETURN_COUNT"] = "5"; + dataMask["TRAY_COUNT"] = "2083"; + dataMask["TRAY_REWORK_COUNT_AVG"] = "3"; + dataMask["TRAY_REWORK_COUNT_MAX"] = "153"; + dataMask["TRAY_REWORK_COUNT_MIN"] = "0"; + dataMask["RACK_DISABLE_COUNT"] = "4"; + dataMask["KOR_EQP_NAME"] = "상온Aging #03"; + dataMask["ENG_EQP_NAME"] = "상온Aging #03"; + dataMask["TIMESTAMP"] = DateTime.Now; + dataMask["STEP"] = new JArray + { + new DataObject { + ["STOCKER_NAME"] = "HFF09AGN0300", + ["STEP_ID"] = "8106", + ["RACK_STEP_COUNT"] = "88", + ["TOTAL"] = "834", + ["STEP_CAPACITY"] = "10.55", + }, + }; + break; + case "ALL": + // ALL 토픽은 ObjectIdKey 없음 + dataMask["AGV"] = new JArray() + { + new DataObject + { + ["VHL_NAME"] = "HFF09CNA8053", + ["AGV_IDX"] = 52, + ["X"] = 223316, + ["Y"] = 218171, + ["B_INSTALL"] = "Y", + ["NODE_ID"] = 235, + ["REAL_ID"] = 235, + ["VHL_STATE"] = 11, + ["BAY_LIST"] = "21;", + ["MODE"] = 1, + ["BATT"] = 75, + ["SUB_GOAL"] = 211, + ["FINAL_GOAL"] = 1006, + ["TIMESTAMP"] = "2025-03-25T12:00:00.980Z", + ["DEGREE"] = 181.2, + ["STOP_STATE"] = 0, + ["JOB_ID"] = "2F24217_289_7038296224059039", + ["DESTINATION_PORT"] = "HFF09MPI0200_LIP01", + ["SOURCE_PORT"] = "HFF09AGM0100_UOP01", + ["FROM"] = "HFF09AGM0100,NULL,0201012", + ["TO"] = "HFF09MPI0200,HFF09MPI0200_LIP01,NULL", + ["TRANSPORT_JOB_TIMESTAMP"] = "2025-03-25T05:40:19.000Z", + ["FACTOR"] = 69.3, + } + }; + dataMask["CARRIER"] = new JArray() + { + new DataObject + { + ["MAIN_CARR_ID"] = "2F02365", + ["SUB_CARR_ID"] = "2F02365,2F70671,2F28723", + ["CARR_SEQ"] = "3", + ["CARR_USE"] = "EMPTY", + ["CURRENTPORT"] = "HFF09CNV0300_ABP3003", + ["MOVESTATUS"] = "ARRIVED", + ["MOVEFLAG"] = "0", + ["PROD_DETAIL_CODE"] = "E3A", + ["ASSIGN_LOT_QTY"] = "0", + ["CARR_SIZE_TYPE"] = "STACK3", + ["ABNM_VALUE"] = "0", + ["LINE_ID"] = "FM0I", + ["TIMESTAMP"] = DateTime.Now, + ["GOOD_QTY"] = "0", + ["CURRENTLOCATION"] = "HFF09CNV0300", + } + }; + dataMask["CARRIER"] = new JArray() + { + new DataObject + { + ["STOCKER_NAME"] = "HFF09AGN0300", + ["CAPACITY"] = "89.57", + ["MAXIMUM_CAPACITY"] = "834", + ["TRAY_CAPACITY"] = "83.25", + ["MAXIMUM_TRAY_CAPACITY"] = "2502", + ["RACK_LOAD_COUNT"] = "747", + ["RACK_EMPTY_COUNT"] = "87", + ["RESERVATED_RETURN_COUNT"] = "5", + ["TRAY_COUNT"] = "2083", + ["TRAY_REWORK_COUNT_AVG"] = "3", + ["TRAY_REWORK_COUNT_MAX"] = "153", + ["TRAY_REWORK_COUNT_MIN"] = "0", + ["RACK_DISABLE_COUNT"] = "4", + ["KOR_EQP_NAME"] = "상온Aging #03", + ["ENG_EQP_NAME"] = "상온Aging #03", + ["TIMESTAMP"] = DateTime.Now, + ["STEP"] = new JArray + { + new DataObject { + ["STOCKER_NAME"] = "HFF09AGN0300", + ["STEP_ID"] = "8106", + ["RACK_STEP_COUNT"] = "88", + ["TOTAL"] = "834", + ["STEP_CAPACITY"] = "10.55", + }, + } + } + }; + break; + } + + return dataMask; + } + + [Test] + public async UniTask ExecutePipeLine_AllTopics_RegistersAndHandlesMessages() + { + // Arrange - 파이프라인 설정 + foreach (var topic in topicNames) + { + // 필요한 UpdatedDataOnly 설정 + bool updatedDataOnly = topic != "ALL"; + + var pipelineInfo = new MQTTPipeLineInfo(topic, updatedDataOnly) + .setDataMapper(new DataMapper(dataMasks[topic])) + .setHandler(handlers[topic].HandleData); + + pipeLine.Add(pipelineInfo); + } + + // Act - 파이프라인 실행 + pipeLine.Execute(); + + // Assert - 일정 시간 기다린 후 각 핸들러가 호출되었는지 확인 + await UniTask.Delay(1500); + + // 각 토픽별로 핸들러가 호출되었는지 확인 + foreach (var topic in topicNames) + { + Assert.IsTrue(handlers[topic].CallCount > 0, $"{topic} 토픽의 핸들러가 호출되지 않았습니다."); + + if (topic != "ALL") + { + // ALL을 제외한 토픽은 ObjectIdKey가 설정되어 있어야 함 + Assert.IsNotNull(handlers[topic].LastDataObject, $"{topic} 토픽의 핸들러에 전달된 DataObject가 null입니다."); + } + } + } + + [Test] + public async UniTask RemoveTopic_ShouldStopReceivingMessages() + { + // Arrange + // AGV 토픽만 등록 + var agvInfo = new MQTTPipeLineInfo("AGV", true) + .setDataMapper(new DataMapper(dataMasks["AGV"])) + .setHandler(handlers["AGV"].HandleData); + + pipeLine.Add(agvInfo); + pipeLine.Execute(); + + // 메시지가 수신되도록 잠시 대기 + await UniTask.Delay(1000); + + // 초기 호출 횟수 저장 + int initialCallCount = handlers["AGV"].CallCount; + Assert.IsTrue(initialCallCount > 0, "초기 AGV 토픽의 핸들러가 호출되지 않았습니다."); + + // Act + pipeLine.Remove("AGV"); // AGV 토픽 제거 + + // 핸들러 초기화 + handlers["AGV"].Reset(); + + // 충분한 시간 대기 + await UniTask.Delay(1500); + + // Assert + Assert.AreEqual(0, handlers["AGV"].CallCount, "토픽을 제거했지만 핸들러가 여전히 호출되고 있습니다."); + } + + [Test] + public async UniTask UpdatedDataOnly_ShouldOnlyCallHandlerForUpdatedData() + { + // Arrange - 파이프라인 설정 + // TestMQTTPipeLine을 사용하여 직접 메시지를 보낼 수 있게 함 + var testPipeLine = new TestMQTTPipeLine(); + + // UpdatedDataOnly가 true인 AGV 토픽 추가 + var agvInfo = new MQTTPipeLineInfo("AGV", true) + .setDataMapper(new DataMapper(dataMasks["AGV"])) + .setHandler(handlers["AGV"].HandleData); + + testPipeLine.Add(agvInfo); + + // Mock 데이터 생성 (업데이트가 있는 데이터) + string jsonWithUpdates = "{\"VHL_NAME\":\"HFF09CNA8053\",\"AGV_IDX\":52,\"X\":223316,\"Y\":218171}"; + + // Act + // 첫 번째 메시지 전송 (초기 데이터) + testPipeLine.TestOnTopicMessage("AGV", jsonWithUpdates); + + // 동일한 메시지 다시 전송 (변경 없음) + testPipeLine.TestOnTopicMessage("AGV", jsonWithUpdates); + + // Assert + // UpdatedDataOnly가 true이므로 두 번째 메시지는 핸들러를 호출하지 않아야 함 + // 실제로는 DataRepository가 필요하므로 완전한 테스트는 어려움 + // 여기서는 최소한 첫 번째 메시지가 처리되었는지 확인 + Assert.IsTrue(handlers["AGV"].CallCount > 0, "AGV 토픽의 핸들러가 호출되지 않았습니다."); + } + + [Test] + public void OnTopicMessage_ValidJsonObject_CallsHandler() + { + // Arrange + var testPipeLine = new TestMQTTPipeLine(); + + foreach (var topic in topicNames) + { + bool updatedDataOnly = topic != "ALL"; + var pipelineInfo = new MQTTPipeLineInfo(topic, updatedDataOnly) + .setDataMapper(new DataMapper(dataMasks[topic])) + .setHandler(handlers[topic].HandleData); + + testPipeLine.Add(pipelineInfo); + } + + // Act + // 각 토픽에 대해 유효한 JSON 메시지 전송 + testPipeLine.TestOnTopicMessage("AGV", "{\"VHL_NAME\":\"HFF09CNA8053\",\"AGV_IDX\":52}"); + testPipeLine.TestOnTopicMessage("CARRIER", "{\"MAIN_CARR_ID\":\"2F02365\",\"SUB_CARR_ID\":\"2F02365,2F70671,2F28723\"}"); + testPipeLine.TestOnTopicMessage("STOCKER_STACK", "{\"STOCKER_NAME\":\"HFF09AGN0300\",\"CAPACITY\":\"89.57\"}"); + testPipeLine.TestOnTopicMessage("ALL", "{\"key\":\"value\"}"); + + // Assert + // 각 토픽의 핸들러가 호출되었는지 확인 + foreach (var topic in topicNames) + { + Assert.AreEqual(1, handlers[topic].CallCount, $"{topic} 토픽의 핸들러가 정확히 한 번 호출되어야 합니다."); + } + } + + [Test] + public void OnTopicMessage_JsonArray_CallsHandler() + { + // Arrange + var testPipeLine = new TestMQTTPipeLine(); + + var pipelineInfo = new MQTTPipeLineInfo("AGV", true) + .setDataMapper(new DataMapper(dataMasks["AGV"])) + .setHandler(handlers["AGV"].HandleData); + + testPipeLine.Add(pipelineInfo); + + // JSON 배열 메시지 생성 + string jsonArrayMessage = + "[{\"VHL_NAME\":\"HFF09CNA8053\",\"AGV_IDX\":52},{\"VHL_NAME\":\"HFF09CNA8033\",\"AGV_IDX\":32}]"; + + // Act + testPipeLine.TestOnTopicMessage("AGV", jsonArrayMessage); + + // Assert + Assert.AreEqual(1, handlers["AGV"].CallCount, "AGV 토픽의 핸들러가 정확히 한 번 호출되어야 합니다."); + Assert.IsNotNull(handlers["AGV"].LastDataObject, "핸들러에 전달된 DataObject가 null입니다."); + } + + [Test] + public void OnTopicMessage_EmptyMessage_DoesNotCallHandler() + { + // Arrange + var testPipeLine = new TestMQTTPipeLine(); + + var pipelineInfo = new MQTTPipeLineInfo("AGV", true) + .setDataMapper(new DataMapper(dataMasks["AGV"])) + .setHandler(handlers["AGV"].HandleData); + + testPipeLine.Add(pipelineInfo); + + // Act + testPipeLine.TestOnTopicMessage("AGV", ""); // 빈 메시지 전송 + + // Assert + Assert.AreEqual(0, handlers["AGV"].CallCount, "빈 메시지가 전달되었을 때 핸들러가 호출되지 않아야 합니다."); + } + + [Test] + public void OnTopicMessage_InvalidJson_DoesNotCallHandler() + { + // Arrange + var testPipeLine = new TestMQTTPipeLine(); + + var pipelineInfo = new MQTTPipeLineInfo("AGV", true) + .setDataMapper(new DataMapper(dataMasks["AGV"])) + .setHandler(handlers["AGV"].HandleData); + + testPipeLine.Add(pipelineInfo); + + // Act - 잘못된 JSON 형식의 메시지 전송 + testPipeLine.TestOnTopicMessage("AGV", "{invalid json}"); + + // Assert + Assert.AreEqual(0, handlers["AGV"].CallCount, "잘못된 JSON 형식의 메시지가 전달되었을 때 핸들러가 호출되지 않아야 합니다."); + } + + [Test] + public async UniTask UpdatedDataOnly_WithMockMQTTService_ShouldOnlyReceiveUpdatedData() + { + // Arrange + // 1. 데이터 핸들러를 통해 수신된 데이터 추적 + var handler = new UpdatedDataTrackingHandler(); + + // 2. AGV 토픽을 위한 데이터 마스크 설정 + var dataMask = new DataMask(); + dataMask.ObjectName = "AGV"; + dataMask.ObjectIdKey = "VHL_NAME"; + + // 3. MQTTPipeLine 설정 (MockMQTTService 사용) + var pipeline = new MQTTPipeLine("localhost", 1883); + pipeline.UseMockup = true; // MockMQTTService 사용 설정 + + // 4. UpdatedDataOnly=true로 토픽 등록 + var pipelineInfo = new MQTTPipeLineInfo("AGV", true) + .setDataMapper(new DataMapper(dataMask)) + .setHandler(handler.HandleData); + + pipeline.Add(pipelineInfo); + + // Act + // 파이프라인 실행 - 이것이 MockMQTTService를 통해 메시지를 보내기 시작 + pipeline.Execute(); + + // 첫 번째 데이터 세트가 수신될 때까지 대기 + await UniTask.Delay(1500); + + // 첫 번째 데이터 세트의 콜백 수를 기록 + int initialCallCount = handler.CallCount; + Assert.IsTrue(initialCallCount > 0, "첫 번째 메시지 세트가 수신되지 않았습니다."); + + // AGV 항목 수 저장 + int initialAgvCount = handler.ReceivedAgvItems.Count; + Assert.IsTrue(initialAgvCount > 0, "첫 번째 메시지에 AGV 항목이 없습니다."); + + // 첫 번째 콜백에서 수신된 업데이트 항목 수 기록 + int firstUpdatedCount = handler.LastUpdatedCount; + Assert.IsTrue(firstUpdatedCount > 0, "첫 번째 메시지에 업데이트된 데이터가 없습니다."); + + // 다음 데이터 세트가 도착하기를 기다림 + await UniTask.Delay(1500); + + // 두 번째 메시지가 도착했는지 확인 + int finalCallCount = handler.CallCount; + Assert.IsTrue(finalCallCount > initialCallCount, "두 번째 메시지 세트가 수신되지 않았습니다."); + + // Assert + // 기본 검사: 모든 호출에서 업데이트된 데이터만 전송되었는지 확인 + foreach (int updatedCount in handler.UpdatedCounts) + { + Assert.IsTrue(updatedCount > 0, "업데이트된 데이터가 없는 콜백이 있습니다."); + } + + // 두 번째 메시지에서 처음 도착한 AGV 항목과 추가/변경된 항목이 있는지 확인 + // MockMQTTService는 매번 다른 데이터 세트를 보내므로 이런 차이가 있어야 함 + bool hasChanges = handler.ReceivedAgvItems.Count > initialAgvCount || + handler.HasUpdatedExistingItems; + + Assert.IsTrue(hasChanges, "두 번째 메시지에서 변경된 데이터가 감지되지 않았습니다."); + + // 정리 + pipeline.Stop(); + pipeline.Dispose(); + } + + // UpdatedDataOnly 테스트를 위한 특수 핸들러 + public class UpdatedDataTrackingHandler + { + public int CallCount { get; private set; } = 0; + public List UpdatedCounts { get; private set; } = new List(); + public int LastUpdatedCount { get; private set; } = 0; + public HashSet ReceivedAgvItems { get; private set; } = new HashSet(); + public bool HasUpdatedExistingItems { get; private set; } = false; + + public void HandleData(IDataObject? dataObject) + { + CallCount++; + + if (dataObject != null) + { + // 업데이트 개수 기록 + LastUpdatedCount = dataObject.UpdatedCount; + UpdatedCounts.Add(dataObject.UpdatedCount); + + // AGV 데이터 분석 + if (dataObject is DataArray agvData) + { + foreach (var item in agvData) + { + if (item is DataObject obj && obj.Name == "AGV" && obj["VHL_NAME"] != null) + { + string vhlName = obj["VHL_NAME"].ToString(); + + // 이미 존재하는 항목이 업데이트된 경우 + if (ReceivedAgvItems.Contains(vhlName)) + { + HasUpdatedExistingItems = true; + } + + // 새로운 항목 추가 + ReceivedAgvItems.Add(vhlName); + } + } + } + } + } + } + } + + // MQTTPipeLine의 OnTopicMessage 메서드를 테스트하기 위한 확장 클래스 + public class TestMQTTPipeLine : MQTTPipeLine + { + public TestMQTTPipeLine() : base("localhost", 1883) + { + UseMockup = true; + } + + public void TestOnTopicMessage(string topic, string message) + { + // private 메서드에 접근하기 위한 래퍼 + typeof(MQTTPipeLine).GetMethod("OnTopicMessage", + System.Reflection.BindingFlags.NonPublic | + System.Reflection.BindingFlags.Instance)?.Invoke(this, new object[] { topic, message }); + } + } + + // 테스트용 데이터 핸들러 클래스 + public class TestDataHandler + { + public int CallCount { get; private set; } = 0; + public IDataObject? LastDataObject { get; private set; } = null; + + public void HandleData(IDataObject? dataObject) + { + CallCount++; + LastDataObject = dataObject; + } + + public void Reset() + { + CallCount = 0; + LastDataObject = null; + } + } +} \ No newline at end of file diff --git a/Assets/Scripts/UVC/Tests/Data/MQTTPipeLineTests.cs.meta b/Assets/Scripts/UVC/Tests/Data/MQTTPipeLineTests.cs.meta new file mode 100644 index 00000000..9e6d1635 --- /dev/null +++ b/Assets/Scripts/UVC/Tests/Data/MQTTPipeLineTests.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 5d12a5bc2caf7f440b9a294cdf18cb4a \ No newline at end of file diff --git a/Assets/Scripts/UVC/Tests/MockMQTTService.cs b/Assets/Scripts/UVC/Tests/MockMQTTService.cs new file mode 100644 index 00000000..59ff8d64 --- /dev/null +++ b/Assets/Scripts/UVC/Tests/MockMQTTService.cs @@ -0,0 +1,173 @@ +using Cysharp.Threading.Tasks; +using System; +using System.Collections.Concurrent; + +namespace UVC.Tests +{ + public class MockMQTTService + { + + private bool connected = false; + private int secondsToWait = 1000; + + public bool IsConnected => connected; + + private ConcurrentDictionary> topicHandler = new ConcurrentDictionary>(); + private Action onMessageReceived; + + private int messageIdx = 0; + + public void Connect() + { + connected = true; + nofityMessage(); + } + + public void Disconnect() + { + connected = false; + } + + /// + /// 특정 MQTT 토픽에 대한 메시지 핸들러를 추가합니다. + /// + /// 구독할 MQTT 토픽입니다. + /// 토픽에 메시지가 수신되면 호출될 핸들러입니다. + /// 첫 번째 매개변수는 토픽이고 두 번째 매개변수는 메시지 내용입니다. + /// + /// 하나의 토픽에 여러 핸들러를 등록할 수 있으며, 메시지 수신 시 모든 핸들러가 호출됩니다. + /// + /// + /// + /// // MQTT 서비스 인스턴스 생성 + /// var mqtt = new MQTTService("localhost", 1883); + /// + /// // 핸들러 등록 및 연결 + /// mqtt.AddTopicHandler("sensor/temperature", (topic, message) => { + /// Debug.Log($"온도 데이터 수신: {message}"); + /// }); + /// mqtt.Connect(); + /// + /// + public void AddTopicHandler(string topic, Action handler) + { + topicHandler.AddOrUpdate( + topic, + // 키가 없을 때 새로운 핸들러 추가 + handler, + // 키가 이미 있을 때 기존 핸들러에 추가 + (_, existingHandler) => existingHandler + handler + ); + } + + /// + /// 특정 MQTT 토픽에서 메시지 핸들러를 제거합니다. + /// + /// 핸들러를 제거할 MQTT 토픽입니다. + /// 제거할 메시지 핸들러입니다. + /// + /// 지정된 토픽에 대한 모든 핸들러가 제거되면 해당 토픽에 대한 키도 제거됩니다. + /// + /// + /// + /// // 핸들러 정의 + /// Action temperatureHandler = (topic, message) => { + /// Debug.Log($"온도 데이터 수신: {message}"); + /// }; + /// + /// // 핸들러 등록 + /// mqtt.AddTopicHandler("sensor/temperature", temperatureHandler); + /// + /// // 나중에 핸들러 제거 + /// mqtt.RemoveTopicHandler("sensor/temperature", temperatureHandler); + /// + /// + public void RemoveTopicHandler(string topic, Action handler) + { + topicHandler.AddOrUpdate( + topic, + // 키가 없는 경우 - 여기서는 발생하면 안 됨 + _ => null, + // 기존 핸들러에서 제거 + (_, existingHandler) => + { + var updatedHandler = existingHandler - handler; + return updatedHandler; + } + ); + + // 핸들러가 null이면 키 자체를 제거 + if (topicHandler.TryGetValue(topic, out var currentHandler) && currentHandler == null) + { + topicHandler.TryRemove(topic, out _); + } + } + + /// + /// 모든 토픽 핸들러를 제거합니다. + /// + /// + /// 이 메서드는 모든 토픽 구독을 효과적으로 취소합니다. 다음에 연결할 때 + /// 새로운 핸들러를 추가해야 합니다. + /// + /// + /// + /// // 모든 핸들러 제거 + /// mqtt.ClearTopicHandlers(); + /// + /// + public void ClearTopicHandlers() + { + topicHandler.Clear(); + } + + private async void nofityMessage() + { + if (!connected) return; + + dispatch("AGV", agvMessage[messageIdx]); + dispatch("CARRIER", carrierMessage[messageIdx]); + dispatch("STOCKER_STACK", stockerStackMessage[messageIdx]); + dispatch("ALL", stockerStackMessage[messageIdx]); + messageIdx++; + if (messageIdx >= agvMessage.Length) + { + messageIdx = 0; // 인덱스가 범위를 벗어나면 초기화 + } + + await UniTask.Delay(secondsToWait); + nofityMessage(); // 재귀 호출로 주기적으로 메시지 전송 + } + + private void dispatch(string topic, string payload) + { + if (topicHandler.TryGetValue(topic, out var handler)) + { + // 등록된 핸들러가 있으면 호출 + handler.Invoke(topic, payload); + } + } + + private string[] agvMessage = new string[]{ + "[{\"VHL_NAME\":\"HFF09CNA8053\",\"AGV_IDX\":52,\"B_INSTALL\":\"Y\",\"NODE_ID\":99226,\"REAL_ID\":99226,\"VHL_STATE\":11,\"BAY_LIST\":\"2;\",\"X\":223316,\"Y\":218171,\"MODE\":1,\"BATT\":69,\"SUB_GOAL\":1657,\"FINAL_GOAL\":81044,\"TIMESTAMP\":\"2025-03-25T11:59:58.952Z\",\"DEGREE\":359.7,\"CARRIER_ID\":null,\"STOP_STATE\":0,\"LOT_ID\":null,\"BATCH_ID\":null,\"CARRIER_TIMESTAMP\":null,\"JOB_ID\":null,\"DESTINATION_PORT\":null,\"SOURCE_PORT\":null,\"FROM\":null,\"TO\":null,\"TRANSPORT_JOB_TIMESTAMP\":null,\"FACTOR\":51.88,\"AGV_FACTOR_TIMESTAMP\":\"2025-03-25T11:59:04.000Z\"},{\"VHL_NAME\":\"HFF09CNA8033\",\"AGV_IDX\":32,\"B_INSTALL\":\"Y\",\"NODE_ID\":734,\"REAL_ID\":734,\"VHL_STATE\":11,\"BAY_LIST\":\"5;15;\",\"X\":136275,\"Y\":112783,\"MODE\":1,\"BATT\":74,\"SUB_GOAL\":182,\"FINAL_GOAL\":99107,\"TIMESTAMP\":\"2025-03-25T11:59:59.968Z\",\"DEGREE\":180.2,\"CARRIER_ID\":\"2F22537,2F08542,2F06190\",\"STOP_STATE\":0,\"LOT_ID\":\"36092531461205BKDS1B\",\"BATCH_ID\":\"H1I70SA253FG21\",\"CARRIER_TIMESTAMP\":\"2025-03-25T11:58:11.000Z\",\"JOB_ID\":\"2F22537_260_7060790056483393\",\"DESTINATION_PORT\":\"HFB11CNV0100_LIP02\",\"SOURCE_PORT\":\"HFF09AGN0300_UOP04\",\"FROM\":\"HFF09AGN0300,null,0202204\",\"TO\":\"HFB11CNV0100,HFB11CNV0100_UOP03,null\",\"TRANSPORT_JOB_TIMESTAMP\":\"2025-03-25T11:57:57.000Z\",\"FACTOR\":67.91,\"AGV_FACTOR_TIMESTAMP\":\"2025-03-25T11:59:04.000Z\"},{\"VHL_NAME\":\"HFF09CNA8051\",\"AGV_IDX\":50,\"B_INSTALL\":\"Y\",\"NODE_ID\":80004,\"REAL_ID\":80004,\"VHL_STATE\":94,\"BAY_LIST\":\"8;15;\",\"X\":250153,\"Y\":115715,\"MODE\":1,\"BATT\":79,\"SUB_GOAL\":0,\"FINAL_GOAL\":80004,\"TIMESTAMP\":\"2025-03-25T11:59:58.959Z\",\"DEGREE\":269.3,\"CARRIER_ID\":null,\"STOP_STATE\":0,\"LOT_ID\":null,\"BATCH_ID\":null,\"CARRIER_TIMESTAMP\":null,\"JOB_ID\":\"2F50746_398_7061037573669158\",\"DESTINATION_PORT\":\"HFB11CNV0100_LIP02\",\"SOURCE_PORT\":\"HFF11AGN0100_UOP04\",\"FROM\":\"HFF11AGN0100,null,0102111\",\"TO\":\"HFB11CNV0100,HFB11CNV0100_UOP03,null\",\"TRANSPORT_JOB_TIMESTAMP\":\"2025-03-25T11:59:57.000Z\",\"FACTOR\":70.37,\"AGV_FACTOR_TIMESTAMP\":\"2025-03-25T11:59:04.000Z\"}]", + "[{\"VHL_NAME\":\"HFF09CNA8013\",\"AGV_IDX\":12,\"B_INSTALL\":\"Y\",\"NODE_ID\":235,\"REAL_ID\":235,\"VHL_STATE\":11,\"BAY_LIST\":\"21;\",\"X\":118301,\"Y\":20177,\"MODE\":1,\"BATT\":75,\"SUB_GOAL\":211,\"FINAL_GOAL\":1006,\"TIMESTAMP\":\"2025-03-25T12:00:00.980Z\",\"DEGREE\":181.2,\"CARRIER_ID\":null,\"STOP_STATE\":0,\"LOT_ID\":null,\"BATCH_ID\":null,\"CARRIER_TIMESTAMP\":null,\"JOB_ID\":\"2F24217_289_7038296224059039\",\"DESTINATION_PORT\":\"HFF09MPI0200_LIP01\",\"SOURCE_PORT\":\"HFF09AGM0100_UOP01\",\"FROM\":\"HFF09AGM0100,NULL,0201012\",\"TO\":\"HFF09MPI0200,HFF09MPI0200_LIP01,NULL\",\"TRANSPORT_JOB_TIMESTAMP\":\"2025-03-25T05:40:19.000Z\",\"FACTOR\":69.3,\"AGV_FACTOR_TIMESTAMP\":\"2025-03-25T11:59:04.000Z\"},{\"VHL_NAME\":\"HFF09CNA8047\",\"AGV_IDX\":46,\"B_INSTALL\":\"Y\",\"NODE_ID\":1022,\"REAL_ID\":1022,\"VHL_STATE\":12,\"BAY_LIST\":\"21;7;\",\"X\":184722,\"Y\":15032,\"MODE\":1,\"BATT\":37,\"SUB_GOAL\":1022,\"FINAL_GOAL\":1022,\"TIMESTAMP\":\"2025-03-25T12:00:00.979Z\",\"DEGREE\":89.5,\"CARRIER_ID\":null,\"STOP_STATE\":0,\"LOT_ID\":null,\"BATCH_ID\":null,\"CARRIER_TIMESTAMP\":null,\"JOB_ID\":null,\"DESTINATION_PORT\":null,\"SOURCE_PORT\":null,\"FROM\":null,\"TO\":null,\"TRANSPORT_JOB_TIMESTAMP\":null,\"FACTOR\":46.27,\"AGV_FACTOR_TIMESTAMP\":\"2025-03-25T11:59:04.000Z\"},{\"VHL_NAME\":\"HFF09CNA8086\",\"AGV_IDX\":85,\"B_INSTALL\":\"Y\",\"NODE_ID\":81016,\"REAL_ID\":81016,\"VHL_STATE\":11,\"BAY_LIST\":\"9;\",\"X\":413564,\"Y\":46530,\"MODE\":1,\"BATT\":85,\"SUB_GOAL\":849,\"FINAL_GOAL\":849,\"TIMESTAMP\":\"2025-03-25T11:59:59.978Z\",\"DEGREE\":359.2,\"CARRIER_ID\":null,\"STOP_STATE\":0,\"LOT_ID\":null,\"BATCH_ID\":null,\"CARRIER_TIMESTAMP\":null,\"JOB_ID\":null,\"DESTINATION_PORT\":null,\"SOURCE_PORT\":null,\"FROM\":null,\"TO\":null,\"TRANSPORT_JOB_TIMESTAMP\":null,\"FACTOR\":69.93,\"AGV_FACTOR_TIMESTAMP\":\"2025-03-25T11:59:04.000Z\"}]", + "[{\"VHL_NAME\":\"HFF09CNA8013\",\"AGV_IDX\":12,\"B_INSTALL\":\"Y\",\"NODE_ID\":235,\"REAL_ID\":235,\"VHL_STATE\":11,\"BAY_LIST\":\"21;\",\"X\":118301,\"Y\":20177,\"MODE\":1,\"BATT\":75,\"SUB_GOAL\":211,\"FINAL_GOAL\":1006,\"TIMESTAMP\":\"2025-03-25T12:00:00.980Z\",\"DEGREE\":181.2,\"CARRIER_ID\":null,\"STOP_STATE\":0,\"LOT_ID\":null,\"BATCH_ID\":null,\"CARRIER_TIMESTAMP\":null,\"JOB_ID\":\"2F24217_289_7038296224059039\",\"DESTINATION_PORT\":\"HFF09MPI0200_LIP01\",\"SOURCE_PORT\":\"HFF09AGM0100_UOP01\",\"FROM\":\"HFF09AGM0100,NULL,0201012\",\"TO\":\"HFF09MPI0200,HFF09MPI0200_LIP01,NULL\",\"TRANSPORT_JOB_TIMESTAMP\":\"2025-03-25T05:40:19.000Z\",\"FACTOR\":69.3,\"AGV_FACTOR_TIMESTAMP\":\"2025-03-25T11:59:04.000Z\"},{\"VHL_NAME\":\"HFF09CNA8047\",\"AGV_IDX\":46,\"B_INSTALL\":\"Y\",\"NODE_ID\":1022,\"REAL_ID\":1022,\"VHL_STATE\":12,\"BAY_LIST\":\"21;7;\",\"X\":184722,\"Y\":15032,\"MODE\":1,\"BATT\":37,\"SUB_GOAL\":1022,\"FINAL_GOAL\":1022,\"TIMESTAMP\":\"2025-03-25T12:00:00.979Z\",\"DEGREE\":89.5,\"CARRIER_ID\":null,\"STOP_STATE\":0,\"LOT_ID\":null,\"BATCH_ID\":null,\"CARRIER_TIMESTAMP\":null,\"JOB_ID\":null,\"DESTINATION_PORT\":null,\"SOURCE_PORT\":null,\"FROM\":null,\"TO\":null,\"TRANSPORT_JOB_TIMESTAMP\":null,\"FACTOR\":46.27,\"AGV_FACTOR_TIMESTAMP\":\"2025-03-25T11:59:04.000Z\"},{\"VHL_NAME\":\"HFF09CNA8086\",\"AGV_IDX\":85,\"B_INSTALL\":\"Y\",\"NODE_ID\":81016,\"REAL_ID\":81016,\"VHL_STATE\":11,\"BAY_LIST\":\"9;\",\"X\":413564,\"Y\":46530,\"MODE\":1,\"BATT\":85,\"SUB_GOAL\":849,\"FINAL_GOAL\":849,\"TIMESTAMP\":\"2025-03-25T11:59:59.978Z\",\"DEGREE\":359.2,\"CARRIER_ID\":null,\"STOP_STATE\":0,\"LOT_ID\":null,\"BATCH_ID\":null,\"CARRIER_TIMESTAMP\":null,\"JOB_ID\":null,\"DESTINATION_PORT\":null,\"SOURCE_PORT\":null,\"FROM\":null,\"TO\":null,\"TRANSPORT_JOB_TIMESTAMP\":null,\"FACTOR\":69.93,\"AGV_FACTOR_TIMESTAMP\":\"2025-03-25T11:59:04.000Z\"}]" + }; + private string[] carrierMessage = new string[]{ + "[{\"MAIN_CARR_ID\":\"2F02365\",\"SUB_CARR_ID\":\"2F02365,2F70671,2F28723\",\"CARR_SEQ\":\"3\",\"CARR_USE\":\"EMPTY\",\"CURRENTPORT\":\"HFF09CNV0300_ABP3003\",\"CURRENTRACK\":null,\"MOVE_JOBID\":null,\"MOVESTATUS\":\"ARRIVED\",\"FINALTOOLID\":null,\"MOVEFLAG\":\"0\",\"PROD_ID\":null,\"FTY_NO\":null,\"WORK_TYPE\":null,\"MFG_TYPE\":null,\"PROD_DETAIL_CODE\":\"E3A\",\"STEP_ID\":null,\"NEXT_STEP_ID\":null,\"ASSIGN_LOT_QTY\":\"0\",\"FRMT_BATCH_ID\":null,\"CARR_SIZE_TYPE\":\"STACK3\",\"ABNM_VALUE\":\"0\",\"LINE_ID\":\"FM0I\",\"TIMESTAMP\":\"2025-03-25T11:59:57.000Z\",\"INPUT_QTY\":null,\"GOOD_QTY\":\"0\",\"BAD_QTY\":null,\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"NEXT_KOR_STEP_GROUP_NAME\":null,\"NEXT_ENG_STEP_GROUP_NAME\":null,\"LOT_ID\":null,\"CTH_REEL_ID\":null,\"ANODE_REEL_ID\":null,\"CARR_NO\":null,\"BATCH_GUBUN\":null,\"PROC_IN_TIME\":null,\"IN_CARR_QTY\":null,\"LAST_TKIN_TIME\":null,\"VHCL_ID\":null,\"FIRST_FRMT_INPUT_TIME\":null,\"CURRENTLOCATION\":\"HFF09CNV0300\",\"JOB_ID\":null,\"FROM_PORT\":null,\"TO_PORT\":null,\"TRANSPORT_JOB_TIMESTAMP\":null},{\"MAIN_CARR_ID\":\"2F50746\",\"SUB_CARR_ID\":\"2F50746,2F10132,2F53089\",\"CARR_SEQ\":\"3\",\"CARR_USE\":\"FULL\",\"CURRENTPORT\":\"HFF11AGN0100_UOP04\",\"CURRENTRACK\":null,\"MOVE_JOBID\":\"2F50746_398_7061037573669158\",\"MOVESTATUS\":\"ARRIVED\",\"FINALTOOLID\":\"HFB11CNV0100_UOP03\",\"MOVEFLAG\":\"1\",\"PROD_ID\":\"CP7024F111A\",\"FTY_NO\":\"70B0\",\"WORK_TYPE\":\"NM\",\"MFG_TYPE\":\"PP02\",\"PROD_DETAIL_CODE\":\"E3A\",\"STEP_ID\":\"8182\",\"NEXT_STEP_ID\":\"8250\",\"ASSIGN_LOT_QTY\":\"288\",\"FRMT_BATCH_ID\":\"H1I70SA253FG21\",\"CARR_SIZE_TYPE\":\"STACK3\",\"ABNM_VALUE\":\"0\",\"LINE_ID\":\"FM0I\",\"TIMESTAMP\":\"2025-03-25T11:59:53.000Z\",\"INPUT_QTY\":\"288\",\"GOOD_QTY\":\"288\",\"BAD_QTY\":null,\"KOR_STEP_GROUP_NAME\":\"방치 IR/OCV #2\",\"ENG_STEP_GROUP_NAME\":\"Boxing IR/OCV 2\",\"NEXT_KOR_STEP_GROUP_NAME\":\"외관검사\",\"NEXT_ENG_STEP_GROUP_NAME\":\"External Inspection\",\"LOT_ID\":\"36092531465248BKDS1B\",\"CTH_REEL_ID\":\"H16CP25312A115D\",\"ANODE_REEL_ID\":\"H16AP25312A131F\",\"CARR_NO\":\"H1I70SB252A313-3119\",\"BATCH_GUBUN\":\"PP02\",\"PROC_IN_TIME\":\"2025-03-14T06:06:39.000Z\",\"IN_CARR_QTY\":\"267\",\"LAST_TKIN_TIME\":\"2025-03-24T04:57:10.000Z\",\"VHCL_ID\":null,\"FIRST_FRMT_INPUT_TIME\":\"2025-03-14T06:06:42.000Z\",\"CURRENTLOCATION\":\"HFF11AGN0100\",\"JOB_ID\":\"2F50746_398_7061037573669158\",\"FROM_PORT\":\"HFF11AGN0100,null,0102111\",\"TO_PORT\":\"HFB11CNV0100,HFB11CNV0100_UOP03,null\",\"TRANSPORT_JOB_TIMESTAMP\":\"2025-03-25T11:59:53.000Z\"},{\"MAIN_CARR_ID\":\"2F52504\",\"SUB_CARR_ID\":\"2F52504,2F11450,2F51910\",\"CARR_SEQ\":\"3\",\"CARR_USE\":\"FULL\",\"CURRENTPORT\":\"HFF09CDS0200_UBP02\",\"CURRENTRACK\":null,\"MOVE_JOBID\":null,\"MOVESTATUS\":\"ARRIVED\",\"FINALTOOLID\":null,\"MOVEFLAG\":\"0\",\"PROD_ID\":\"CP7024F111A\",\"FTY_NO\":\"70B0\",\"WORK_TYPE\":\"NM\",\"MFG_TYPE\":\"PP02\",\"PROD_DETAIL_CODE\":\"E3A\",\"STEP_ID\":\"8024\",\"NEXT_STEP_ID\":\"8025\",\"ASSIGN_LOT_QTY\":\"288\",\"FRMT_BATCH_ID\":\"H1J70SA253HO22\",\"CARR_SIZE_TYPE\":\"STACK3\",\"ABNM_VALUE\":\"0\",\"LINE_ID\":\"FM0I\",\"TIMESTAMP\":\"2025-03-25T11:59:57.000Z\",\"INPUT_QTY\":\"288\",\"GOOD_QTY\":\"288\",\"BAD_QTY\":null,\"KOR_STEP_GROUP_NAME\":\"고온 Aging3\",\"ENG_STEP_GROUP_NAME\":\"High Temp Aging3\",\"NEXT_KOR_STEP_GROUP_NAME\":\"냉각 Aging3\",\"NEXT_ENG_STEP_GROUP_NAME\":\"Cold Temp Aging3\",\"LOT_ID\":\"36092532270707BKDS1B\",\"CTH_REEL_ID\":\"H16CP25310A118D\",\"ANODE_REEL_ID\":\"H16AP25321A113E\",\"CARR_NO\":\"H1J70SA251DC13-5524\",\"BATCH_GUBUN\":\"PP02\",\"PROC_IN_TIME\":\"2025-03-22T21:57:57.000Z\",\"IN_CARR_QTY\":\"288\",\"LAST_TKIN_TIME\":\"2025-03-25T09:46:35.000Z\",\"VHCL_ID\":null,\"FIRST_FRMT_INPUT_TIME\":\"2025-03-22T21:58:00.000Z\",\"CURRENTLOCATION\":\"HFF09CDS0200\",\"JOB_ID\":null,\"FROM_PORT\":null,\"TO_PORT\":null,\"TRANSPORT_JOB_TIMESTAMP\":\"2025-03-25T11:57:14.000Z\"}]", + "[{\"MAIN_CARR_ID\":\"2F02365\",\"SUB_CARR_ID\":\"2F02365,2F70671,2F28723\",\"CARR_SEQ\":\"3\",\"CARR_USE\":\"EMPTY\",\"CURRENTPORT\":\"HFF09CNV0300_ABP3003\",\"CURRENTRACK\":null,\"MOVE_JOBID\":null,\"MOVESTATUS\":\"ARRIVED\",\"FINALTOOLID\":null,\"MOVEFLAG\":\"0\",\"PROD_ID\":null,\"FTY_NO\":null,\"WORK_TYPE\":null,\"MFG_TYPE\":null,\"PROD_DETAIL_CODE\":\"E3A\",\"STEP_ID\":null,\"NEXT_STEP_ID\":null,\"ASSIGN_LOT_QTY\":\"0\",\"FRMT_BATCH_ID\":null,\"CARR_SIZE_TYPE\":\"STACK3\",\"ABNM_VALUE\":\"0\",\"LINE_ID\":\"FM0I\",\"TIMESTAMP\":\"2025-03-25T11:59:57.000Z\",\"INPUT_QTY\":null,\"GOOD_QTY\":\"0\",\"BAD_QTY\":null,\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"NEXT_KOR_STEP_GROUP_NAME\":null,\"NEXT_ENG_STEP_GROUP_NAME\":null,\"LOT_ID\":null,\"CTH_REEL_ID\":null,\"ANODE_REEL_ID\":null,\"CARR_NO\":null,\"BATCH_GUBUN\":null,\"PROC_IN_TIME\":null,\"IN_CARR_QTY\":null,\"LAST_TKIN_TIME\":null,\"VHCL_ID\":null,\"FIRST_FRMT_INPUT_TIME\":null,\"CURRENTLOCATION\":\"HFF09CNV0300\",\"JOB_ID\":null,\"FROM_PORT\":null,\"TO_PORT\":null,\"TRANSPORT_JOB_TIMESTAMP\":null},{\"MAIN_CARR_ID\":\"2F52504\",\"SUB_CARR_ID\":\"2F52504,2F11450,2F51910\",\"CARR_SEQ\":\"3\",\"CARR_USE\":\"FULL\",\"CURRENTPORT\":\"HFF09CDS0200_UBP02\",\"CURRENTRACK\":null,\"MOVE_JOBID\":null,\"MOVESTATUS\":\"ARRIVED\",\"FINALTOOLID\":null,\"MOVEFLAG\":\"0\",\"PROD_ID\":\"CP7024F111A\",\"FTY_NO\":\"70B0\",\"WORK_TYPE\":\"NM\",\"MFG_TYPE\":\"PP02\",\"PROD_DETAIL_CODE\":\"E3A\",\"STEP_ID\":\"8024\",\"NEXT_STEP_ID\":\"8025\",\"ASSIGN_LOT_QTY\":\"288\",\"FRMT_BATCH_ID\":\"H1J70SA253HO22\",\"CARR_SIZE_TYPE\":\"STACK3\",\"ABNM_VALUE\":\"0\",\"LINE_ID\":\"FM0I\",\"TIMESTAMP\":\"2025-03-25T11:59:57.000Z\",\"INPUT_QTY\":\"288\",\"GOOD_QTY\":\"288\",\"BAD_QTY\":null,\"KOR_STEP_GROUP_NAME\":\"고온 Aging3\",\"ENG_STEP_GROUP_NAME\":\"High Temp Aging3\",\"NEXT_KOR_STEP_GROUP_NAME\":\"냉각 Aging3\",\"NEXT_ENG_STEP_GROUP_NAME\":\"Cold Temp Aging3\",\"LOT_ID\":\"36092532270707BKDS1B\",\"CTH_REEL_ID\":\"H16CP25310A118D\",\"ANODE_REEL_ID\":\"H16AP25321A113E\",\"CARR_NO\":\"H1J70SA251DC13-5524\",\"BATCH_GUBUN\":\"PP02\",\"PROC_IN_TIME\":\"2025-03-22T21:57:57.000Z\",\"IN_CARR_QTY\":\"288\",\"LAST_TKIN_TIME\":\"2025-03-25T09:46:35.000Z\",\"VHCL_ID\":null,\"FIRST_FRMT_INPUT_TIME\":\"2025-03-22T21:58:00.000Z\",\"CURRENTLOCATION\":\"HFF09CDS0200\",\"JOB_ID\":null,\"FROM_PORT\":null,\"TO_PORT\":null,\"TRANSPORT_JOB_TIMESTAMP\":\"2025-03-25T11:57:14.000Z\"}]", + "[{\"MAIN_CARR_ID\":\"2F02365\",\"SUB_CARR_ID\":\"2F02365,2F70671,2F28723\",\"CARR_SEQ\":\"3\",\"CARR_USE\":\"EMPTY\",\"CURRENTPORT\":\"HFF09CNV0300_ABP3003\",\"CURRENTRACK\":null,\"MOVE_JOBID\":null,\"MOVESTATUS\":\"ARRIVED\",\"FINALTOOLID\":null,\"MOVEFLAG\":\"0\",\"PROD_ID\":null,\"FTY_NO\":null,\"WORK_TYPE\":null,\"MFG_TYPE\":null,\"PROD_DETAIL_CODE\":\"E3A\",\"STEP_ID\":null,\"NEXT_STEP_ID\":null,\"ASSIGN_LOT_QTY\":\"0\",\"FRMT_BATCH_ID\":null,\"CARR_SIZE_TYPE\":\"STACK3\",\"ABNM_VALUE\":\"0\",\"LINE_ID\":\"FM0I\",\"TIMESTAMP\":\"2025-03-25T11:59:57.000Z\",\"INPUT_QTY\":null,\"GOOD_QTY\":\"0\",\"BAD_QTY\":null,\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"NEXT_KOR_STEP_GROUP_NAME\":null,\"NEXT_ENG_STEP_GROUP_NAME\":null,\"LOT_ID\":null,\"CTH_REEL_ID\":null,\"ANODE_REEL_ID\":null,\"CARR_NO\":null,\"BATCH_GUBUN\":null,\"PROC_IN_TIME\":null,\"IN_CARR_QTY\":null,\"LAST_TKIN_TIME\":null,\"VHCL_ID\":null,\"FIRST_FRMT_INPUT_TIME\":null,\"CURRENTLOCATION\":\"HFF09CNV0300\",\"JOB_ID\":null,\"FROM_PORT\":null,\"TO_PORT\":null,\"TRANSPORT_JOB_TIMESTAMP\":null},{\"MAIN_CARR_ID\":\"2F52504\",\"SUB_CARR_ID\":\"2F52504,2F11450,2F51910\",\"CARR_SEQ\":\"3\",\"CARR_USE\":\"FULL\",\"CURRENTPORT\":\"HFF09CDS0200_UBP02\",\"CURRENTRACK\":null,\"MOVE_JOBID\":null,\"MOVESTATUS\":\"ARRIVED\",\"FINALTOOLID\":null,\"MOVEFLAG\":\"0\",\"PROD_ID\":\"CP7024F111A\",\"FTY_NO\":\"70B0\",\"WORK_TYPE\":\"NM\",\"MFG_TYPE\":\"PP02\",\"PROD_DETAIL_CODE\":\"E3A\",\"STEP_ID\":\"8024\",\"NEXT_STEP_ID\":\"8025\",\"ASSIGN_LOT_QTY\":\"288\",\"FRMT_BATCH_ID\":\"H1J70SA253HO22\",\"CARR_SIZE_TYPE\":\"STACK3\",\"ABNM_VALUE\":\"0\",\"LINE_ID\":\"FM0I\",\"TIMESTAMP\":\"2025-03-25T11:59:57.000Z\",\"INPUT_QTY\":\"288\",\"GOOD_QTY\":\"288\",\"BAD_QTY\":null,\"KOR_STEP_GROUP_NAME\":\"고온 Aging3\",\"ENG_STEP_GROUP_NAME\":\"High Temp Aging3\",\"NEXT_KOR_STEP_GROUP_NAME\":\"냉각 Aging3\",\"NEXT_ENG_STEP_GROUP_NAME\":\"Cold Temp Aging3\",\"LOT_ID\":\"36092532270707BKDS1B\",\"CTH_REEL_ID\":\"H16CP25310A118D\",\"ANODE_REEL_ID\":\"H16AP25321A113E\",\"CARR_NO\":\"H1J70SA251DC13-5524\",\"BATCH_GUBUN\":\"PP02\",\"PROC_IN_TIME\":\"2025-03-22T21:57:57.000Z\",\"IN_CARR_QTY\":\"288\",\"LAST_TKIN_TIME\":\"2025-03-25T09:46:35.000Z\",\"VHCL_ID\":null,\"FIRST_FRMT_INPUT_TIME\":\"2025-03-22T21:58:00.000Z\",\"CURRENTLOCATION\":\"HFF09CDS0200\",\"JOB_ID\":null,\"FROM_PORT\":null,\"TO_PORT\":null,\"TRANSPORT_JOB_TIMESTAMP\":\"2025-03-25T11:57:14.000Z\"},{\"MAIN_CARR_ID\":\"3F18182\",\"SUB_CARR_ID\":\"3F18182\",\"CARR_SEQ\":\"1\",\"CARR_USE\":\"FULL\",\"CURRENTPORT\":\"HFF11CNV0500_ABP4714\",\"CURRENTRACK\":null,\"MOVE_JOBID\":null,\"MOVESTATUS\":\"IN-EQP\",\"FINALTOOLID\":null,\"MOVEFLAG\":\"0\",\"PROD_ID\":\"CP7024F111A\",\"FTY_NO\":\"70B0\",\"WORK_TYPE\":\"NM\",\"MFG_TYPE\":\"PP02\",\"PROD_DETAIL_CODE\":\"E3A\",\"STEP_ID\":\"8108\",\"NEXT_STEP_ID\":\"8116\",\"ASSIGN_LOT_QTY\":\"96\",\"FRMT_BATCH_ID\":\"H1M70SB253GL21\",\"CARR_SIZE_TYPE\":\"STACK4\",\"ABNM_VALUE\":\"0\",\"LINE_ID\":\"FM0M\",\"TIMESTAMP\":\"2025-03-25T11:59:55.000Z\",\"INPUT_QTY\":\"96\",\"GOOD_QTY\":\"96\",\"BAD_QTY\":null,\"KOR_STEP_GROUP_NAME\":\"출하 IR/OCV\",\"ENG_STEP_GROUP_NAME\":\"G/I IR/OCV\",\"NEXT_KOR_STEP_GROUP_NAME\":\"IR/OCV4 불량선별\",\"NEXT_ENG_STEP_GROUP_NAME\":\"IR/OCV4 Defect Detect\",\"LOT_ID\":\"36112531922037BKDS1B\",\"CTH_REEL_ID\":\"H16CP25309A120B\",\"ANODE_REEL_ID\":\"H16AP25309A121D\",\"CARR_NO\":\"H1M70SA253GJ13-022\",\"BATCH_GUBUN\":\"PP02\",\"PROC_IN_TIME\":\"2025-03-19T16:38:53.000Z\",\"IN_CARR_QTY\":\"96\",\"LAST_TKIN_TIME\":\"2025-03-25T11:59:54.000Z\",\"VHCL_ID\":null,\"FIRST_FRMT_INPUT_TIME\":\"2025-03-19T16:38:55.000Z\",\"CURRENTLOCATION\":\"HFF11CNV0500\",\"JOB_ID\":null,\"FROM_PORT\":null,\"TO_PORT\":null,\"TRANSPORT_JOB_TIMESTAMP\":null}]" + }; + private string[] stockerStackMessage = new string[]{ + "[{\"STOCKER_NAME\":\"HFF09AGN0300\",\"CAPACITY\":\"89.57\",\"MAXIMUM_CAPACITY\":\"834\",\"TRAY_CAPACITY\":\"83.25\",\"MAXIMUM_TRAY_CAPACITY\":\"2502\",\"RACK_LOAD_COUNT\":\"747\",\"RACK_EMPTY_COUNT\":\"87\",\"RESERVATED_RETURN_COUNT\":\"5\",\"TRAY_COUNT\":\"2083\",\"TRAY_REWORK_COUNT_AVG\":\"3\",\"TRAY_REWORK_COUNT_MAX\":\"153\",\"TRAY_REWORK_COUNT_MIN\":\"0\",\"RACK_DISABLE_COUNT\":\"4\",\"KOR_EQP_NAME\":\"상온Aging #03\",\"ENG_EQP_NAME\":\"상온Aging #03\",\"TIMESTAMP\":\"2025-03-25T11:59:56.000Z\",\"STEP\":[{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8106\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"88\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"10.55\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8220\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"88\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"10.55\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8100\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"88\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"10.55\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8038\",\"KOR_STEP_GROUP_NAME\":\"디게싱에이징1\",\"ENG_STEP_GROUP_NAME\":\"Deggassing Aging1\",\"RACK_STEP_COUNT\":\"8\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"0.96\",\"TIMESTAMP\":\"2025-03-25T11:59:59.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8150\",\"KOR_STEP_GROUP_NAME\":\"용량검사\",\"ENG_STEP_GROUP_NAME\":\"Capacity Inspection\",\"RACK_STEP_COUNT\":\"1\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"0.12\",\"TIMESTAMP\":\"2025-03-25T11:21:18.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8136\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"88\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"10.55\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8134\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"88\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"10.55\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8116\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"88\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"10.55\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8028\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"88\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"10.55\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8012\",\"KOR_STEP_GROUP_NAME\":\"상온 Aging2\",\"ENG_STEP_GROUP_NAME\":\"Normal Temp Aging2\",\"RACK_STEP_COUNT\":\"24\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"2.88\",\"TIMESTAMP\":\"2025-03-25T11:59:59.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8057\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"88\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"10.55\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8070\",\"KOR_STEP_GROUP_NAME\":\"호퍼 pre-c 전 임시밀폐제거\",\"ENG_STEP_GROUP_NAME\":\"Temp Sealing Remove(Pre-C)\",\"RACK_STEP_COUNT\":\"1\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"0.12\",\"TIMESTAMP\":\"2025-03-25T10:56:56.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8140\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"88\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"10.55\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8138\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"88\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"10.55\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8025\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"88\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"10.55\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8010\",\"KOR_STEP_GROUP_NAME\":\"상온 Aging1\",\"ENG_STEP_GROUP_NAME\":\"Normal Temp Aging1\",\"RACK_STEP_COUNT\":\"123\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"14.75\",\"TIMESTAMP\":\"2025-03-25T11:59:59.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8014\",\"KOR_STEP_GROUP_NAME\":\"상온 Aging3\",\"ENG_STEP_GROUP_NAME\":\"Normal Temp Aging3\",\"RACK_STEP_COUNT\":\"106\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"12.71\",\"TIMESTAMP\":\"2025-03-25T11:59:59.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8016\",\"KOR_STEP_GROUP_NAME\":\"상온 Aging4\",\"ENG_STEP_GROUP_NAME\":\"Normal Temp Aging4\",\"RACK_STEP_COUNT\":\"117\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"14.03\",\"TIMESTAMP\":\"2025-03-25T11:59:59.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8040\",\"KOR_STEP_GROUP_NAME\":\"출하 Aging\",\"ENG_STEP_GROUP_NAME\":\"G/I Aging\",\"RACK_STEP_COUNT\":\"215\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"25.78\",\"TIMESTAMP\":\"2025-03-25T11:59:59.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8042\",\"KOR_STEP_GROUP_NAME\":\"상온 Aging5\",\"ENG_STEP_GROUP_NAME\":\"Normal Temp Aging5\",\"RACK_STEP_COUNT\":\"3\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"0.36\",\"TIMESTAMP\":\"2025-03-25T11:59:59.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8044\",\"KOR_STEP_GROUP_NAME\":\"상온 Aging6\",\"ENG_STEP_GROUP_NAME\":\"Normal Temp Aging6\",\"RACK_STEP_COUNT\":\"6\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"0.72\",\"TIMESTAMP\":\"2025-03-25T11:59:59.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8045\",\"KOR_STEP_GROUP_NAME\":\"상온 Aging7\",\"ENG_STEP_GROUP_NAME\":\"Normal Temp Aging7\",\"RACK_STEP_COUNT\":\"21\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"2.52\",\"TIMESTAMP\":\"2025-03-25T11:59:59.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8046\",\"KOR_STEP_GROUP_NAME\":\"상온 Aging8\",\"ENG_STEP_GROUP_NAME\":\"Normal Temp Aging8\",\"RACK_STEP_COUNT\":\"3\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"0.36\",\"TIMESTAMP\":\"2025-03-25T11:59:59.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8190\",\"KOR_STEP_GROUP_NAME\":\"방치 AGING #1\",\"ENG_STEP_GROUP_NAME\":\"Boxing Aging 1\",\"RACK_STEP_COUNT\":\"1\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"0.12\",\"TIMESTAMP\":\"2025-03-25T11:59:59.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8400\",\"KOR_STEP_GROUP_NAME\":\"포장\",\"ENG_STEP_GROUP_NAME\":\"Packing\",\"RACK_STEP_COUNT\":\"76\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"9.11\",\"TIMESTAMP\":\"2025-03-25T11:59:59.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8132\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"88\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"10.55\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8245\",\"KOR_STEP_GROUP_NAME\":\"외관검사1\",\"ENG_STEP_GROUP_NAME\":\"External Inspection 1\",\"RACK_STEP_COUNT\":\"1\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"0.12\",\"TIMESTAMP\":\"2025-03-25T10:41:12.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8182\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"88\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"10.55\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8108\",\"KOR_STEP_GROUP_NAME\":\"출하 IR/OCV\",\"ENG_STEP_GROUP_NAME\":\"G/I IR/OCV\",\"RACK_STEP_COUNT\":\"1\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"0.12\",\"TIMESTAMP\":\"2025-03-25T11:04:49.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8102\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"88\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"10.55\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8192\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"88\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"10.55\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"0\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"44\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"5.28\",\"TIMESTAMP\":\"2025-03-25T11:59:59.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8047\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"88\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"10.55\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8104\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"88\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"10.55\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8024\",\"KOR_STEP_GROUP_NAME\":\"고온 Aging3\",\"ENG_STEP_GROUP_NAME\":\"High Temp Aging3\",\"RACK_STEP_COUNT\":\"1\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"0.12\",\"TIMESTAMP\":\"2025-03-25T09:08:25.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8130\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"88\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"10.55\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":null,\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"87\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"10.43\",\"TIMESTAMP\":\"2025-03-25T11:59:59.000Z\"}]},{\"STOCKER_NAME\":\"HFF09AGM0100\",\"CAPACITY\":\"95.43\",\"MAXIMUM_CAPACITY\":\"810\",\"TRAY_CAPACITY\":\"93.54\",\"MAXIMUM_TRAY_CAPACITY\":\"2430\",\"RACK_LOAD_COUNT\":\"773\",\"RACK_EMPTY_COUNT\":\"37\",\"RESERVATED_RETURN_COUNT\":\"9\",\"TRAY_COUNT\":\"2273\",\"TRAY_REWORK_COUNT_AVG\":\"6\",\"TRAY_REWORK_COUNT_MAX\":\"132\",\"TRAY_REWORK_COUNT_MIN\":\"0\",\"RACK_DISABLE_COUNT\":\"55\",\"KOR_EQP_NAME\":\"출하창고(Module Cell Aging) #01\",\"ENG_EQP_NAME\":\"출하창고(Module Cell Aging) #01\",\"TIMESTAMP\":\"2025-03-25T11:59:56.000Z\",\"STEP\":[{\"STOCKER_NAME\":\"HFF09AGM0100\",\"STEP_ID\":\"8040\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"38\",\"TOTAL\":\"810\",\"STEP_CAPACITY\":\"4.69\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGM0100\",\"STEP_ID\":\"0\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"38\",\"TOTAL\":\"810\",\"STEP_CAPACITY\":\"4.69\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGM0100\",\"STEP_ID\":\"8046\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"38\",\"TOTAL\":\"810\",\"STEP_CAPACITY\":\"4.69\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGM0100\",\"STEP_ID\":\"8192\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"38\",\"TOTAL\":\"810\",\"STEP_CAPACITY\":\"4.69\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGM0100\",\"STEP_ID\":\"8190\",\"KOR_STEP_GROUP_NAME\":\"방치 AGING #1\",\"ENG_STEP_GROUP_NAME\":\"Boxing Aging 1\",\"RACK_STEP_COUNT\":\"5\",\"TOTAL\":\"810\",\"STEP_CAPACITY\":\"0.62\",\"TIMESTAMP\":\"2025-03-25T11:59:59.000Z\"},{\"STOCKER_NAME\":\"HFF09AGM0100\",\"STEP_ID\":\"8400\",\"KOR_STEP_GROUP_NAME\":\"포장\",\"ENG_STEP_GROUP_NAME\":\"Packing\",\"RACK_STEP_COUNT\":\"768\",\"TOTAL\":\"810\",\"STEP_CAPACITY\":\"94.81\",\"TIMESTAMP\":\"2025-03-25T11:59:59.000Z\"},{\"STOCKER_NAME\":\"HFF09AGM0100\",\"STEP_ID\":\"8245\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"38\",\"TOTAL\":\"810\",\"STEP_CAPACITY\":\"4.69\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGM0100\",\"STEP_ID\":\"8106\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"38\",\"TOTAL\":\"810\",\"STEP_CAPACITY\":\"4.69\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGM0100\",\"STEP_ID\":\"8010\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"38\",\"TOTAL\":\"810\",\"STEP_CAPACITY\":\"4.69\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGM0100\",\"STEP_ID\":\"8182\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"38\",\"TOTAL\":\"810\",\"STEP_CAPACITY\":\"4.69\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGM0100\",\"STEP_ID\":\"8220\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"38\",\"TOTAL\":\"810\",\"STEP_CAPACITY\":\"4.69\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGM0100\",\"STEP_ID\":\"8014\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"38\",\"TOTAL\":\"810\",\"STEP_CAPACITY\":\"4.69\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGM0100\",\"STEP_ID\":\"8108\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"38\",\"TOTAL\":\"810\",\"STEP_CAPACITY\":\"4.69\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGM0100\",\"STEP_ID\":\"8250\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"38\",\"TOTAL\":\"810\",\"STEP_CAPACITY\":\"4.69\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGM0100\",\"STEP_ID\":\"8016\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"38\",\"TOTAL\":\"810\",\"STEP_CAPACITY\":\"4.69\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGM0100\",\"STEP_ID\":\"8047\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"38\",\"TOTAL\":\"810\",\"STEP_CAPACITY\":\"4.69\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGM0100\",\"STEP_ID\":null,\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"37\",\"TOTAL\":\"810\",\"STEP_CAPACITY\":\"4.57\",\"TIMESTAMP\":\"2025-03-25T11:59:59.000Z\"}]},{\"STOCKER_NAME\":\"HFF09AGH0100\",\"CAPACITY\":\"89.9\",\"MAXIMUM_CAPACITY\":\"406\",\"TRAY_CAPACITY\":\"88.59\",\"MAXIMUM_TRAY_CAPACITY\":\"1218\",\"RACK_LOAD_COUNT\":\"365\",\"RACK_EMPTY_COUNT\":\"41\",\"RESERVATED_RETURN_COUNT\":\"7\",\"TRAY_COUNT\":\"1079\",\"TRAY_REWORK_COUNT_AVG\":\"6\",\"TRAY_REWORK_COUNT_MAX\":\"64\",\"TRAY_REWORK_COUNT_MIN\":\"0\",\"RACK_DISABLE_COUNT\":\"0\",\"KOR_EQP_NAME\":\"고온Aging #01\",\"ENG_EQP_NAME\":\"고온Aging #01\",\"TIMESTAMP\":\"2025-03-25T11:59:56.000Z\",\"STEP\":[{\"STOCKER_NAME\":\"HFF09AGH0100\",\"STEP_ID\":\"8190\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"39\",\"TOTAL\":\"406\",\"STEP_CAPACITY\":\"9.61\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGH0100\",\"STEP_ID\":\"8040\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"39\",\"TOTAL\":\"406\",\"STEP_CAPACITY\":\"9.61\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGH0100\",\"STEP_ID\":\"8016\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"39\",\"TOTAL\":\"406\",\"STEP_CAPACITY\":\"9.61\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGH0100\",\"STEP_ID\":\"8020\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"39\",\"TOTAL\":\"406\",\"STEP_CAPACITY\":\"9.61\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGH0100\",\"STEP_ID\":\"8150\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"39\",\"TOTAL\":\"406\",\"STEP_CAPACITY\":\"9.61\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGH0100\",\"STEP_ID\":\"8024\",\"KOR_STEP_GROUP_NAME\":\"고온 Aging3\",\"ENG_STEP_GROUP_NAME\":\"High Temp Aging3\",\"RACK_STEP_COUNT\":\"251\",\"TOTAL\":\"406\",\"STEP_CAPACITY\":\"61.82\",\"TIMESTAMP\":\"2025-03-25T11:59:59.000Z\"},{\"STOCKER_NAME\":\"HFF09AGH0100\",\"STEP_ID\":\"8028\",\"KOR_STEP_GROUP_NAME\":\"고온 Aging5\",\"ENG_STEP_GROUP_NAME\":\"High Temp Aging5\",\"RACK_STEP_COUNT\":\"1\",\"TOTAL\":\"406\",\"STEP_CAPACITY\":\"0.25\",\"TIMESTAMP\":\"2025-03-25T11:59:59.000Z\"},{\"STOCKER_NAME\":\"HFF09AGH0100\",\"STEP_ID\":\"0\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"113\",\"TOTAL\":\"406\",\"STEP_CAPACITY\":\"27.83\",\"TIMESTAMP\":\"2025-03-25T11:59:59.000Z\"},{\"STOCKER_NAME\":\"HFF09AGH0100\",\"STEP_ID\":\"8025\",\"KOR_STEP_GROUP_NAME\":\"냉각 Aging3\",\"ENG_STEP_GROUP_NAME\":\"Cold Temp Aging3\",\"RACK_STEP_COUNT\":\"1\",\"TOTAL\":\"406\",\"STEP_CAPACITY\":\"0.25\",\"TIMESTAMP\":\"2025-03-25T11:23:53.000Z\"},{\"STOCKER_NAME\":\"HFF09AGH0100\",\"STEP_ID\":\"8022\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"39\",\"TOTAL\":\"406\",\"STEP_CAPACITY\":\"9.61\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGH0100\",\"STEP_ID\":\"8026\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"39\",\"TOTAL\":\"406\",\"STEP_CAPACITY\":\"9.61\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGH0100\",\"STEP_ID\":\"8029\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"39\",\"TOTAL\":\"406\",\"STEP_CAPACITY\":\"9.61\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGH0100\",\"STEP_ID\":null,\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"41\",\"TOTAL\":\"406\",\"STEP_CAPACITY\":\"10.1\",\"TIMESTAMP\":\"2025-03-25T11:59:59.000Z\"}]}]", + "[{\"STOCKER_NAME\":\"HFF09AGN0300\",\"CAPACITY\":\"89.57\",\"MAXIMUM_CAPACITY\":\"834\",\"TRAY_CAPACITY\":\"83.25\",\"MAXIMUM_TRAY_CAPACITY\":\"2502\",\"RACK_LOAD_COUNT\":\"747\",\"RACK_EMPTY_COUNT\":\"87\",\"RESERVATED_RETURN_COUNT\":\"5\",\"TRAY_COUNT\":\"2083\",\"TRAY_REWORK_COUNT_AVG\":\"3\",\"TRAY_REWORK_COUNT_MAX\":\"153\",\"TRAY_REWORK_COUNT_MIN\":\"0\",\"RACK_DISABLE_COUNT\":\"4\",\"KOR_EQP_NAME\":\"상온Aging #03\",\"ENG_EQP_NAME\":\"상온Aging #03\",\"TIMESTAMP\":\"2025-03-25T11:59:56.000Z\",\"STEP\":[{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8106\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"88\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"10.55\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8220\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"88\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"10.55\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8100\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"88\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"10.55\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8038\",\"KOR_STEP_GROUP_NAME\":\"디게싱에이징1\",\"ENG_STEP_GROUP_NAME\":\"Deggassing Aging1\",\"RACK_STEP_COUNT\":\"8\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"0.96\",\"TIMESTAMP\":\"2025-03-25T12:00:00.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8150\",\"KOR_STEP_GROUP_NAME\":\"용량검사\",\"ENG_STEP_GROUP_NAME\":\"Capacity Inspection\",\"RACK_STEP_COUNT\":\"1\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"0.12\",\"TIMESTAMP\":\"2025-03-25T11:21:18.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8136\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"88\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"10.55\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8134\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"88\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"10.55\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8116\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"88\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"10.55\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8028\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"88\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"10.55\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8012\",\"KOR_STEP_GROUP_NAME\":\"상온 Aging2\",\"ENG_STEP_GROUP_NAME\":\"Normal Temp Aging2\",\"RACK_STEP_COUNT\":\"24\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"2.88\",\"TIMESTAMP\":\"2025-03-25T12:00:00.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8057\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"88\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"10.55\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8070\",\"KOR_STEP_GROUP_NAME\":\"호퍼 pre-c 전 임시밀폐제거\",\"ENG_STEP_GROUP_NAME\":\"Temp Sealing Remove(Pre-C)\",\"RACK_STEP_COUNT\":\"1\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"0.12\",\"TIMESTAMP\":\"2025-03-25T10:56:56.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8140\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"88\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"10.55\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8138\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"88\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"10.55\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8025\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"88\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"10.55\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8010\",\"KOR_STEP_GROUP_NAME\":\"상온 Aging1\",\"ENG_STEP_GROUP_NAME\":\"Normal Temp Aging1\",\"RACK_STEP_COUNT\":\"123\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"14.75\",\"TIMESTAMP\":\"2025-03-25T12:00:00.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8014\",\"KOR_STEP_GROUP_NAME\":\"상온 Aging3\",\"ENG_STEP_GROUP_NAME\":\"Normal Temp Aging3\",\"RACK_STEP_COUNT\":\"106\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"12.71\",\"TIMESTAMP\":\"2025-03-25T12:00:00.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8016\",\"KOR_STEP_GROUP_NAME\":\"상온 Aging4\",\"ENG_STEP_GROUP_NAME\":\"Normal Temp Aging4\",\"RACK_STEP_COUNT\":\"117\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"14.03\",\"TIMESTAMP\":\"2025-03-25T12:00:00.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8040\",\"KOR_STEP_GROUP_NAME\":\"출하 Aging\",\"ENG_STEP_GROUP_NAME\":\"G/I Aging\",\"RACK_STEP_COUNT\":\"215\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"25.78\",\"TIMESTAMP\":\"2025-03-25T12:00:00.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8042\",\"KOR_STEP_GROUP_NAME\":\"상온 Aging5\",\"ENG_STEP_GROUP_NAME\":\"Normal Temp Aging5\",\"RACK_STEP_COUNT\":\"3\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"0.36\",\"TIMESTAMP\":\"2025-03-25T12:00:00.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8044\",\"KOR_STEP_GROUP_NAME\":\"상온 Aging6\",\"ENG_STEP_GROUP_NAME\":\"Normal Temp Aging6\",\"RACK_STEP_COUNT\":\"6\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"0.72\",\"TIMESTAMP\":\"2025-03-25T12:00:00.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8045\",\"KOR_STEP_GROUP_NAME\":\"상온 Aging7\",\"ENG_STEP_GROUP_NAME\":\"Normal Temp Aging7\",\"RACK_STEP_COUNT\":\"21\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"2.52\",\"TIMESTAMP\":\"2025-03-25T12:00:00.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8046\",\"KOR_STEP_GROUP_NAME\":\"상온 Aging8\",\"ENG_STEP_GROUP_NAME\":\"Normal Temp Aging8\",\"RACK_STEP_COUNT\":\"3\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"0.36\",\"TIMESTAMP\":\"2025-03-25T12:00:00.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8190\",\"KOR_STEP_GROUP_NAME\":\"방치 AGING #1\",\"ENG_STEP_GROUP_NAME\":\"Boxing Aging 1\",\"RACK_STEP_COUNT\":\"1\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"0.12\",\"TIMESTAMP\":\"2025-03-25T12:00:00.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8400\",\"KOR_STEP_GROUP_NAME\":\"포장\",\"ENG_STEP_GROUP_NAME\":\"Packing\",\"RACK_STEP_COUNT\":\"76\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"9.11\",\"TIMESTAMP\":\"2025-03-25T12:00:00.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8132\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"88\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"10.55\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8245\",\"KOR_STEP_GROUP_NAME\":\"외관검사1\",\"ENG_STEP_GROUP_NAME\":\"External Inspection 1\",\"RACK_STEP_COUNT\":\"1\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"0.12\",\"TIMESTAMP\":\"2025-03-25T10:41:12.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8182\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"88\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"10.55\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8108\",\"KOR_STEP_GROUP_NAME\":\"출하 IR/OCV\",\"ENG_STEP_GROUP_NAME\":\"G/I IR/OCV\",\"RACK_STEP_COUNT\":\"1\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"0.12\",\"TIMESTAMP\":\"2025-03-25T11:04:49.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8102\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"88\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"10.55\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8192\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"88\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"10.55\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"0\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"44\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"5.28\",\"TIMESTAMP\":\"2025-03-25T12:00:00.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8047\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"88\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"10.55\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8104\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"88\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"10.55\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8024\",\"KOR_STEP_GROUP_NAME\":\"고온 Aging3\",\"ENG_STEP_GROUP_NAME\":\"High Temp Aging3\",\"RACK_STEP_COUNT\":\"1\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"0.12\",\"TIMESTAMP\":\"2025-03-25T09:08:25.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8130\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"88\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"10.55\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":null,\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"87\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"10.43\",\"TIMESTAMP\":\"2025-03-25T12:00:00.000Z\"}]},{\"STOCKER_NAME\":\"HFF09AGM0100\",\"CAPACITY\":\"95.43\",\"MAXIMUM_CAPACITY\":\"810\",\"TRAY_CAPACITY\":\"93.54\",\"MAXIMUM_TRAY_CAPACITY\":\"2430\",\"RACK_LOAD_COUNT\":\"773\",\"RACK_EMPTY_COUNT\":\"37\",\"RESERVATED_RETURN_COUNT\":\"9\",\"TRAY_COUNT\":\"2273\",\"TRAY_REWORK_COUNT_AVG\":\"6\",\"TRAY_REWORK_COUNT_MAX\":\"132\",\"TRAY_REWORK_COUNT_MIN\":\"0\",\"RACK_DISABLE_COUNT\":\"55\",\"KOR_EQP_NAME\":\"출하창고(Module Cell Aging) #01\",\"ENG_EQP_NAME\":\"출하창고(Module Cell Aging) #01\",\"TIMESTAMP\":\"2025-03-25T11:59:56.000Z\",\"STEP\":[{\"STOCKER_NAME\":\"HFF09AGM0100\",\"STEP_ID\":\"8040\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"38\",\"TOTAL\":\"810\",\"STEP_CAPACITY\":\"4.69\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGM0100\",\"STEP_ID\":\"0\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"38\",\"TOTAL\":\"810\",\"STEP_CAPACITY\":\"4.69\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGM0100\",\"STEP_ID\":\"8046\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"38\",\"TOTAL\":\"810\",\"STEP_CAPACITY\":\"4.69\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGM0100\",\"STEP_ID\":\"8192\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"38\",\"TOTAL\":\"810\",\"STEP_CAPACITY\":\"4.69\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGM0100\",\"STEP_ID\":\"8190\",\"KOR_STEP_GROUP_NAME\":\"방치 AGING #1\",\"ENG_STEP_GROUP_NAME\":\"Boxing Aging 1\",\"RACK_STEP_COUNT\":\"5\",\"TOTAL\":\"810\",\"STEP_CAPACITY\":\"0.62\",\"TIMESTAMP\":\"2025-03-25T12:00:00.000Z\"},{\"STOCKER_NAME\":\"HFF09AGM0100\",\"STEP_ID\":\"8400\",\"KOR_STEP_GROUP_NAME\":\"포장\",\"ENG_STEP_GROUP_NAME\":\"Packing\",\"RACK_STEP_COUNT\":\"768\",\"TOTAL\":\"810\",\"STEP_CAPACITY\":\"94.81\",\"TIMESTAMP\":\"2025-03-25T12:00:00.000Z\"},{\"STOCKER_NAME\":\"HFF09AGM0100\",\"STEP_ID\":\"8245\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"38\",\"TOTAL\":\"810\",\"STEP_CAPACITY\":\"4.69\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGM0100\",\"STEP_ID\":\"8106\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"38\",\"TOTAL\":\"810\",\"STEP_CAPACITY\":\"4.69\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGM0100\",\"STEP_ID\":\"8010\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"38\",\"TOTAL\":\"810\",\"STEP_CAPACITY\":\"4.69\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGM0100\",\"STEP_ID\":\"8182\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"38\",\"TOTAL\":\"810\",\"STEP_CAPACITY\":\"4.69\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGM0100\",\"STEP_ID\":\"8220\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"38\",\"TOTAL\":\"810\",\"STEP_CAPACITY\":\"4.69\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGM0100\",\"STEP_ID\":\"8014\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"38\",\"TOTAL\":\"810\",\"STEP_CAPACITY\":\"4.69\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGM0100\",\"STEP_ID\":\"8108\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"38\",\"TOTAL\":\"810\",\"STEP_CAPACITY\":\"4.69\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGM0100\",\"STEP_ID\":\"8250\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"38\",\"TOTAL\":\"810\",\"STEP_CAPACITY\":\"4.69\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGM0100\",\"STEP_ID\":\"8016\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"38\",\"TOTAL\":\"810\",\"STEP_CAPACITY\":\"4.69\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGM0100\",\"STEP_ID\":\"8047\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"38\",\"TOTAL\":\"810\",\"STEP_CAPACITY\":\"4.69\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGM0100\",\"STEP_ID\":null,\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"37\",\"TOTAL\":\"810\",\"STEP_CAPACITY\":\"4.57\",\"TIMESTAMP\":\"2025-03-25T12:00:00.000Z\"}]},{\"STOCKER_NAME\":\"HFF09AGH0100\",\"CAPACITY\":\"89.9\",\"MAXIMUM_CAPACITY\":\"406\",\"TRAY_CAPACITY\":\"88.59\",\"MAXIMUM_TRAY_CAPACITY\":\"1218\",\"RACK_LOAD_COUNT\":\"365\",\"RACK_EMPTY_COUNT\":\"41\",\"RESERVATED_RETURN_COUNT\":\"7\",\"TRAY_COUNT\":\"1079\",\"TRAY_REWORK_COUNT_AVG\":\"6\",\"TRAY_REWORK_COUNT_MAX\":\"64\",\"TRAY_REWORK_COUNT_MIN\":\"0\",\"RACK_DISABLE_COUNT\":\"0\",\"KOR_EQP_NAME\":\"고온Aging #01\",\"ENG_EQP_NAME\":\"고온Aging #01\",\"TIMESTAMP\":\"2025-03-25T11:59:56.000Z\",\"STEP\":[{\"STOCKER_NAME\":\"HFF09AGH0100\",\"STEP_ID\":\"8190\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"39\",\"TOTAL\":\"406\",\"STEP_CAPACITY\":\"9.61\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGH0100\",\"STEP_ID\":\"8040\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"39\",\"TOTAL\":\"406\",\"STEP_CAPACITY\":\"9.61\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGH0100\",\"STEP_ID\":\"8016\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"39\",\"TOTAL\":\"406\",\"STEP_CAPACITY\":\"9.61\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGH0100\",\"STEP_ID\":\"8020\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"39\",\"TOTAL\":\"406\",\"STEP_CAPACITY\":\"9.61\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGH0100\",\"STEP_ID\":\"8150\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"39\",\"TOTAL\":\"406\",\"STEP_CAPACITY\":\"9.61\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGH0100\",\"STEP_ID\":\"8024\",\"KOR_STEP_GROUP_NAME\":\"고온 Aging3\",\"ENG_STEP_GROUP_NAME\":\"High Temp Aging3\",\"RACK_STEP_COUNT\":\"251\",\"TOTAL\":\"406\",\"STEP_CAPACITY\":\"61.82\",\"TIMESTAMP\":\"2025-03-25T12:00:00.000Z\"},{\"STOCKER_NAME\":\"HFF09AGH0100\",\"STEP_ID\":\"8028\",\"KOR_STEP_GROUP_NAME\":\"고온 Aging5\",\"ENG_STEP_GROUP_NAME\":\"High Temp Aging5\",\"RACK_STEP_COUNT\":\"1\",\"TOTAL\":\"406\",\"STEP_CAPACITY\":\"0.25\",\"TIMESTAMP\":\"2025-03-25T12:00:00.000Z\"},{\"STOCKER_NAME\":\"HFF09AGH0100\",\"STEP_ID\":\"0\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"113\",\"TOTAL\":\"406\",\"STEP_CAPACITY\":\"27.83\",\"TIMESTAMP\":\"2025-03-25T12:00:00.000Z\"},{\"STOCKER_NAME\":\"HFF09AGH0100\",\"STEP_ID\":\"8025\",\"KOR_STEP_GROUP_NAME\":\"냉각 Aging3\",\"ENG_STEP_GROUP_NAME\":\"Cold Temp Aging3\",\"RACK_STEP_COUNT\":\"1\",\"TOTAL\":\"406\",\"STEP_CAPACITY\":\"0.25\",\"TIMESTAMP\":\"2025-03-25T11:23:53.000Z\"},{\"STOCKER_NAME\":\"HFF09AGH0100\",\"STEP_ID\":\"8022\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"39\",\"TOTAL\":\"406\",\"STEP_CAPACITY\":\"9.61\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGH0100\",\"STEP_ID\":\"8026\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"39\",\"TOTAL\":\"406\",\"STEP_CAPACITY\":\"9.61\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGH0100\",\"STEP_ID\":\"8029\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"39\",\"TOTAL\":\"406\",\"STEP_CAPACITY\":\"9.61\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGH0100\",\"STEP_ID\":null,\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"41\",\"TOTAL\":\"406\",\"STEP_CAPACITY\":\"10.1\",\"TIMESTAMP\":\"2025-03-25T12:00:00.000Z\"}]}]", + "[{\"STOCKER_NAME\":\"HFF09AGN0300\",\"CAPACITY\":\"89.57\",\"MAXIMUM_CAPACITY\":\"834\",\"TRAY_CAPACITY\":\"83.25\",\"MAXIMUM_TRAY_CAPACITY\":\"2502\",\"RACK_LOAD_COUNT\":\"747\",\"RACK_EMPTY_COUNT\":\"87\",\"RESERVATED_RETURN_COUNT\":\"5\",\"TRAY_COUNT\":\"2083\",\"TRAY_REWORK_COUNT_AVG\":\"3\",\"TRAY_REWORK_COUNT_MAX\":\"153\",\"TRAY_REWORK_COUNT_MIN\":\"0\",\"RACK_DISABLE_COUNT\":\"4\",\"KOR_EQP_NAME\":\"상온Aging #03\",\"ENG_EQP_NAME\":\"상온Aging #03\",\"TIMESTAMP\":\"2025-03-25T12:00:00.000Z\",\"STEP\":[{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8106\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"88\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"10.55\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8220\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"88\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"10.55\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8100\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"88\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"10.55\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8038\",\"KOR_STEP_GROUP_NAME\":\"디게싱에이징1\",\"ENG_STEP_GROUP_NAME\":\"Deggassing Aging1\",\"RACK_STEP_COUNT\":\"8\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"0.96\",\"TIMESTAMP\":\"2025-03-25T12:00:01.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8150\",\"KOR_STEP_GROUP_NAME\":\"용량검사\",\"ENG_STEP_GROUP_NAME\":\"Capacity Inspection\",\"RACK_STEP_COUNT\":\"1\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"0.12\",\"TIMESTAMP\":\"2025-03-25T11:21:18.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8136\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"88\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"10.55\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8134\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"88\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"10.55\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8116\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"88\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"10.55\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8028\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"88\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"10.55\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8012\",\"KOR_STEP_GROUP_NAME\":\"상온 Aging2\",\"ENG_STEP_GROUP_NAME\":\"Normal Temp Aging2\",\"RACK_STEP_COUNT\":\"24\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"2.88\",\"TIMESTAMP\":\"2025-03-25T12:00:01.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8057\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"88\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"10.55\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8070\",\"KOR_STEP_GROUP_NAME\":\"호퍼 pre-c 전 임시밀폐제거\",\"ENG_STEP_GROUP_NAME\":\"Temp Sealing Remove(Pre-C)\",\"RACK_STEP_COUNT\":\"1\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"0.12\",\"TIMESTAMP\":\"2025-03-25T10:56:56.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8140\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"88\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"10.55\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8138\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"88\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"10.55\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8025\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"88\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"10.55\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8010\",\"KOR_STEP_GROUP_NAME\":\"상온 Aging1\",\"ENG_STEP_GROUP_NAME\":\"Normal Temp Aging1\",\"RACK_STEP_COUNT\":\"123\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"14.75\",\"TIMESTAMP\":\"2025-03-25T12:00:01.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8014\",\"KOR_STEP_GROUP_NAME\":\"상온 Aging3\",\"ENG_STEP_GROUP_NAME\":\"Normal Temp Aging3\",\"RACK_STEP_COUNT\":\"106\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"12.71\",\"TIMESTAMP\":\"2025-03-25T12:00:01.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8016\",\"KOR_STEP_GROUP_NAME\":\"상온 Aging4\",\"ENG_STEP_GROUP_NAME\":\"Normal Temp Aging4\",\"RACK_STEP_COUNT\":\"117\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"14.03\",\"TIMESTAMP\":\"2025-03-25T12:00:01.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8040\",\"KOR_STEP_GROUP_NAME\":\"출하 Aging\",\"ENG_STEP_GROUP_NAME\":\"G/I Aging\",\"RACK_STEP_COUNT\":\"215\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"25.78\",\"TIMESTAMP\":\"2025-03-25T12:00:01.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8042\",\"KOR_STEP_GROUP_NAME\":\"상온 Aging5\",\"ENG_STEP_GROUP_NAME\":\"Normal Temp Aging5\",\"RACK_STEP_COUNT\":\"3\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"0.36\",\"TIMESTAMP\":\"2025-03-25T12:00:01.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8044\",\"KOR_STEP_GROUP_NAME\":\"상온 Aging6\",\"ENG_STEP_GROUP_NAME\":\"Normal Temp Aging6\",\"RACK_STEP_COUNT\":\"6\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"0.72\",\"TIMESTAMP\":\"2025-03-25T12:00:01.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8045\",\"KOR_STEP_GROUP_NAME\":\"상온 Aging7\",\"ENG_STEP_GROUP_NAME\":\"Normal Temp Aging7\",\"RACK_STEP_COUNT\":\"21\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"2.52\",\"TIMESTAMP\":\"2025-03-25T12:00:01.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8046\",\"KOR_STEP_GROUP_NAME\":\"상온 Aging8\",\"ENG_STEP_GROUP_NAME\":\"Normal Temp Aging8\",\"RACK_STEP_COUNT\":\"3\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"0.36\",\"TIMESTAMP\":\"2025-03-25T12:00:01.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8190\",\"KOR_STEP_GROUP_NAME\":\"방치 AGING #1\",\"ENG_STEP_GROUP_NAME\":\"Boxing Aging 1\",\"RACK_STEP_COUNT\":\"1\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"0.12\",\"TIMESTAMP\":\"2025-03-25T12:00:01.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8400\",\"KOR_STEP_GROUP_NAME\":\"포장\",\"ENG_STEP_GROUP_NAME\":\"Packing\",\"RACK_STEP_COUNT\":\"76\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"9.11\",\"TIMESTAMP\":\"2025-03-25T12:00:01.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8132\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"88\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"10.55\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8245\",\"KOR_STEP_GROUP_NAME\":\"외관검사1\",\"ENG_STEP_GROUP_NAME\":\"External Inspection 1\",\"RACK_STEP_COUNT\":\"1\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"0.12\",\"TIMESTAMP\":\"2025-03-25T10:41:12.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8182\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"88\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"10.55\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8108\",\"KOR_STEP_GROUP_NAME\":\"출하 IR/OCV\",\"ENG_STEP_GROUP_NAME\":\"G/I IR/OCV\",\"RACK_STEP_COUNT\":\"1\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"0.12\",\"TIMESTAMP\":\"2025-03-25T11:04:49.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8102\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"88\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"10.55\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8192\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"88\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"10.55\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"0\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"44\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"5.28\",\"TIMESTAMP\":\"2025-03-25T12:00:01.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8047\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"88\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"10.55\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8104\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"88\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"10.55\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8024\",\"KOR_STEP_GROUP_NAME\":\"고온 Aging3\",\"ENG_STEP_GROUP_NAME\":\"High Temp Aging3\",\"RACK_STEP_COUNT\":\"1\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"0.12\",\"TIMESTAMP\":\"2025-03-25T09:08:25.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8130\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"88\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"10.55\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":null,\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"87\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"10.43\",\"TIMESTAMP\":\"2025-03-25T12:00:01.000Z\"}]},{\"STOCKER_NAME\":\"HFF09AGM0100\",\"CAPACITY\":\"95.43\",\"MAXIMUM_CAPACITY\":\"810\",\"TRAY_CAPACITY\":\"93.54\",\"MAXIMUM_TRAY_CAPACITY\":\"2430\",\"RACK_LOAD_COUNT\":\"773\",\"RACK_EMPTY_COUNT\":\"37\",\"RESERVATED_RETURN_COUNT\":\"9\",\"TRAY_COUNT\":\"2273\",\"TRAY_REWORK_COUNT_AVG\":\"6\",\"TRAY_REWORK_COUNT_MAX\":\"132\",\"TRAY_REWORK_COUNT_MIN\":\"0\",\"RACK_DISABLE_COUNT\":\"55\",\"KOR_EQP_NAME\":\"출하창고(Module Cell Aging) #01\",\"ENG_EQP_NAME\":\"출하창고(Module Cell Aging) #01\",\"TIMESTAMP\":\"2025-03-25T12:00:00.000Z\",\"STEP\":[{\"STOCKER_NAME\":\"HFF09AGM0100\",\"STEP_ID\":\"8040\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"38\",\"TOTAL\":\"810\",\"STEP_CAPACITY\":\"4.69\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGM0100\",\"STEP_ID\":\"0\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"38\",\"TOTAL\":\"810\",\"STEP_CAPACITY\":\"4.69\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGM0100\",\"STEP_ID\":\"8046\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"38\",\"TOTAL\":\"810\",\"STEP_CAPACITY\":\"4.69\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGM0100\",\"STEP_ID\":\"8192\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"38\",\"TOTAL\":\"810\",\"STEP_CAPACITY\":\"4.69\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGM0100\",\"STEP_ID\":\"8190\",\"KOR_STEP_GROUP_NAME\":\"방치 AGING #1\",\"ENG_STEP_GROUP_NAME\":\"Boxing Aging 1\",\"RACK_STEP_COUNT\":\"5\",\"TOTAL\":\"810\",\"STEP_CAPACITY\":\"0.62\",\"TIMESTAMP\":\"2025-03-25T12:00:01.000Z\"},{\"STOCKER_NAME\":\"HFF09AGM0100\",\"STEP_ID\":\"8400\",\"KOR_STEP_GROUP_NAME\":\"포장\",\"ENG_STEP_GROUP_NAME\":\"Packing\",\"RACK_STEP_COUNT\":\"768\",\"TOTAL\":\"810\",\"STEP_CAPACITY\":\"94.81\",\"TIMESTAMP\":\"2025-03-25T12:00:01.000Z\"},{\"STOCKER_NAME\":\"HFF09AGM0100\",\"STEP_ID\":\"8245\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"38\",\"TOTAL\":\"810\",\"STEP_CAPACITY\":\"4.69\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGM0100\",\"STEP_ID\":\"8106\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"38\",\"TOTAL\":\"810\",\"STEP_CAPACITY\":\"4.69\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGM0100\",\"STEP_ID\":\"8010\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"38\",\"TOTAL\":\"810\",\"STEP_CAPACITY\":\"4.69\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGM0100\",\"STEP_ID\":\"8182\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"38\",\"TOTAL\":\"810\",\"STEP_CAPACITY\":\"4.69\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGM0100\",\"STEP_ID\":\"8220\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"38\",\"TOTAL\":\"810\",\"STEP_CAPACITY\":\"4.69\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGM0100\",\"STEP_ID\":\"8014\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"38\",\"TOTAL\":\"810\",\"STEP_CAPACITY\":\"4.69\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGM0100\",\"STEP_ID\":\"8108\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"38\",\"TOTAL\":\"810\",\"STEP_CAPACITY\":\"4.69\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGM0100\",\"STEP_ID\":\"8250\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"38\",\"TOTAL\":\"810\",\"STEP_CAPACITY\":\"4.69\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGM0100\",\"STEP_ID\":\"8016\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"38\",\"TOTAL\":\"810\",\"STEP_CAPACITY\":\"4.69\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGM0100\",\"STEP_ID\":\"8047\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"38\",\"TOTAL\":\"810\",\"STEP_CAPACITY\":\"4.69\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGM0100\",\"STEP_ID\":null,\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"37\",\"TOTAL\":\"810\",\"STEP_CAPACITY\":\"4.57\",\"TIMESTAMP\":\"2025-03-25T12:00:01.000Z\"}]},{\"STOCKER_NAME\":\"HFF09AGH0100\",\"CAPACITY\":\"89.9\",\"MAXIMUM_CAPACITY\":\"406\",\"TRAY_CAPACITY\":\"88.59\",\"MAXIMUM_TRAY_CAPACITY\":\"1218\",\"RACK_LOAD_COUNT\":\"365\",\"RACK_EMPTY_COUNT\":\"41\",\"RESERVATED_RETURN_COUNT\":\"7\",\"TRAY_COUNT\":\"1079\",\"TRAY_REWORK_COUNT_AVG\":\"6\",\"TRAY_REWORK_COUNT_MAX\":\"64\",\"TRAY_REWORK_COUNT_MIN\":\"0\",\"RACK_DISABLE_COUNT\":\"0\",\"KOR_EQP_NAME\":\"고온Aging #01\",\"ENG_EQP_NAME\":\"고온Aging #01\",\"TIMESTAMP\":\"2025-03-25T12:00:00.000Z\",\"STEP\":[{\"STOCKER_NAME\":\"HFF09AGH0100\",\"STEP_ID\":\"8190\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"39\",\"TOTAL\":\"406\",\"STEP_CAPACITY\":\"9.61\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGH0100\",\"STEP_ID\":\"8040\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"39\",\"TOTAL\":\"406\",\"STEP_CAPACITY\":\"9.61\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGH0100\",\"STEP_ID\":\"8016\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"39\",\"TOTAL\":\"406\",\"STEP_CAPACITY\":\"9.61\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGH0100\",\"STEP_ID\":\"8020\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"39\",\"TOTAL\":\"406\",\"STEP_CAPACITY\":\"9.61\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGH0100\",\"STEP_ID\":\"8150\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"39\",\"TOTAL\":\"406\",\"STEP_CAPACITY\":\"9.61\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGH0100\",\"STEP_ID\":\"8024\",\"KOR_STEP_GROUP_NAME\":\"고온 Aging3\",\"ENG_STEP_GROUP_NAME\":\"High Temp Aging3\",\"RACK_STEP_COUNT\":\"251\",\"TOTAL\":\"406\",\"STEP_CAPACITY\":\"61.82\",\"TIMESTAMP\":\"2025-03-25T12:00:01.000Z\"},{\"STOCKER_NAME\":\"HFF09AGH0100\",\"STEP_ID\":\"8028\",\"KOR_STEP_GROUP_NAME\":\"고온 Aging5\",\"ENG_STEP_GROUP_NAME\":\"High Temp Aging5\",\"RACK_STEP_COUNT\":\"1\",\"TOTAL\":\"406\",\"STEP_CAPACITY\":\"0.25\",\"TIMESTAMP\":\"2025-03-25T12:00:01.000Z\"},{\"STOCKER_NAME\":\"HFF09AGH0100\",\"STEP_ID\":\"0\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"113\",\"TOTAL\":\"406\",\"STEP_CAPACITY\":\"27.83\",\"TIMESTAMP\":\"2025-03-25T12:00:01.000Z\"},{\"STOCKER_NAME\":\"HFF09AGH0100\",\"STEP_ID\":\"8025\",\"KOR_STEP_GROUP_NAME\":\"냉각 Aging3\",\"ENG_STEP_GROUP_NAME\":\"Cold Temp Aging3\",\"RACK_STEP_COUNT\":\"1\",\"TOTAL\":\"406\",\"STEP_CAPACITY\":\"0.25\",\"TIMESTAMP\":\"2025-03-25T11:23:53.000Z\"},{\"STOCKER_NAME\":\"HFF09AGH0100\",\"STEP_ID\":\"8022\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"39\",\"TOTAL\":\"406\",\"STEP_CAPACITY\":\"9.61\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGH0100\",\"STEP_ID\":\"8026\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"39\",\"TOTAL\":\"406\",\"STEP_CAPACITY\":\"9.61\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGH0100\",\"STEP_ID\":\"8029\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"39\",\"TOTAL\":\"406\",\"STEP_CAPACITY\":\"9.61\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGH0100\",\"STEP_ID\":null,\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"41\",\"TOTAL\":\"406\",\"STEP_CAPACITY\":\"10.1\",\"TIMESTAMP\":\"2025-03-25T12:00:01.000Z\"}]}]" + }; + private string[] baseInfoMessage = new string[]{ + "{\r\n \"AGV\":[{\"VHL_NAME\":\"HFF09CNA8053\",\"AGV_IDX\":52,\"B_INSTALL\":\"Y\",\"NODE_ID\":99226,\"REAL_ID\":99226,\"VHL_STATE\":11,\"BAY_LIST\":\"2;\",\"X\":223316,\"Y\":218171,\"MODE\":1,\"BATT\":69,\"SUB_GOAL\":1657,\"FINAL_GOAL\":81044,\"TIMESTAMP\":\"2025-03-25T11:59:58.952Z\",\"DEGREE\":359.7,\"CARRIER_ID\":null,\"STOP_STATE\":0,\"LOT_ID\":null,\"BATCH_ID\":null,\"CARRIER_TIMESTAMP\":null,\"JOB_ID\":null,\"DESTINATION_PORT\":null,\"SOURCE_PORT\":null,\"FROM\":null,\"TO\":null,\"TRANSPORT_JOB_TIMESTAMP\":null,\"FACTOR\":51.88,\"AGV_FACTOR_TIMESTAMP\":\"2025-03-25T11:59:04.000Z\"},{\"VHL_NAME\":\"HFF09CNA8033\",\"AGV_IDX\":32,\"B_INSTALL\":\"Y\",\"NODE_ID\":734,\"REAL_ID\":734,\"VHL_STATE\":11,\"BAY_LIST\":\"5;15;\",\"X\":136275,\"Y\":112783,\"MODE\":1,\"BATT\":74,\"SUB_GOAL\":182,\"FINAL_GOAL\":99107,\"TIMESTAMP\":\"2025-03-25T11:59:59.968Z\",\"DEGREE\":180.2,\"CARRIER_ID\":\"2F22537,2F08542,2F06190\",\"STOP_STATE\":0,\"LOT_ID\":\"36092531461205BKDS1B\",\"BATCH_ID\":\"H1I70SA253FG21\",\"CARRIER_TIMESTAMP\":\"2025-03-25T11:58:11.000Z\",\"JOB_ID\":\"2F22537_260_7060790056483393\",\"DESTINATION_PORT\":\"HFB11CNV0100_LIP02\",\"SOURCE_PORT\":\"HFF09AGN0300_UOP04\",\"FROM\":\"HFF09AGN0300,null,0202204\",\"TO\":\"HFB11CNV0100,HFB11CNV0100_UOP03,null\",\"TRANSPORT_JOB_TIMESTAMP\":\"2025-03-25T11:57:57.000Z\",\"FACTOR\":67.91,\"AGV_FACTOR_TIMESTAMP\":\"2025-03-25T11:59:04.000Z\"},{\"VHL_NAME\":\"HFF09CNA8051\",\"AGV_IDX\":50,\"B_INSTALL\":\"Y\",\"NODE_ID\":80004,\"REAL_ID\":80004,\"VHL_STATE\":94,\"BAY_LIST\":\"8;15;\",\"X\":250153,\"Y\":115715,\"MODE\":1,\"BATT\":79,\"SUB_GOAL\":0,\"FINAL_GOAL\":80004,\"TIMESTAMP\":\"2025-03-25T11:59:58.959Z\",\"DEGREE\":269.3,\"CARRIER_ID\":null,\"STOP_STATE\":0,\"LOT_ID\":null,\"BATCH_ID\":null,\"CARRIER_TIMESTAMP\":null,\"JOB_ID\":\"2F50746_398_7061037573669158\",\"DESTINATION_PORT\":\"HFB11CNV0100_LIP02\",\"SOURCE_PORT\":\"HFF11AGN0100_UOP04\",\"FROM\":\"HFF11AGN0100,null,0102111\",\"TO\":\"HFB11CNV0100,HFB11CNV0100_UOP03,null\",\"TRANSPORT_JOB_TIMESTAMP\":\"2025-03-25T11:59:57.000Z\",\"FACTOR\":70.37,\"AGV_FACTOR_TIMESTAMP\":\"2025-03-25T11:59:04.000Z\"}],\r\n \"STOCKER_STACK\":[{\"STOCKER_NAME\":\"HFF09AGN0300\",\"CAPACITY\":\"89.57\",\"MAXIMUM_CAPACITY\":\"834\",\"TRAY_CAPACITY\":\"83.25\",\"MAXIMUM_TRAY_CAPACITY\":\"2502\",\"RACK_LOAD_COUNT\":\"747\",\"RACK_EMPTY_COUNT\":\"87\",\"RESERVATED_RETURN_COUNT\":\"5\",\"TRAY_COUNT\":\"2083\",\"TRAY_REWORK_COUNT_AVG\":\"3\",\"TRAY_REWORK_COUNT_MAX\":\"153\",\"TRAY_REWORK_COUNT_MIN\":\"0\",\"RACK_DISABLE_COUNT\":\"4\",\"KOR_EQP_NAME\":\"상온Aging #03\",\"ENG_EQP_NAME\":\"상온Aging #03\",\"TIMESTAMP\":\"2025-03-25T11:59:56.000Z\",\"STEP\":[{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8106\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"88\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"10.55\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8220\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"88\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"10.55\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8100\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"88\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"10.55\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8038\",\"KOR_STEP_GROUP_NAME\":\"디게싱에이징1\",\"ENG_STEP_GROUP_NAME\":\"Deggassing Aging1\",\"RACK_STEP_COUNT\":\"8\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"0.96\",\"TIMESTAMP\":\"2025-03-25T11:59:59.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8150\",\"KOR_STEP_GROUP_NAME\":\"용량검사\",\"ENG_STEP_GROUP_NAME\":\"Capacity Inspection\",\"RACK_STEP_COUNT\":\"1\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"0.12\",\"TIMESTAMP\":\"2025-03-25T11:21:18.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8136\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"88\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"10.55\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8134\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"88\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"10.55\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8116\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"88\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"10.55\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8028\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"88\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"10.55\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8012\",\"KOR_STEP_GROUP_NAME\":\"상온 Aging2\",\"ENG_STEP_GROUP_NAME\":\"Normal Temp Aging2\",\"RACK_STEP_COUNT\":\"24\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"2.88\",\"TIMESTAMP\":\"2025-03-25T11:59:59.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8057\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"88\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"10.55\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8070\",\"KOR_STEP_GROUP_NAME\":\"호퍼 pre-c 전 임시밀폐제거\",\"ENG_STEP_GROUP_NAME\":\"Temp Sealing Remove(Pre-C)\",\"RACK_STEP_COUNT\":\"1\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"0.12\",\"TIMESTAMP\":\"2025-03-25T10:56:56.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8140\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"88\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"10.55\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8138\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"88\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"10.55\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8025\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"88\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"10.55\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8010\",\"KOR_STEP_GROUP_NAME\":\"상온 Aging1\",\"ENG_STEP_GROUP_NAME\":\"Normal Temp Aging1\",\"RACK_STEP_COUNT\":\"123\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"14.75\",\"TIMESTAMP\":\"2025-03-25T11:59:59.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8014\",\"KOR_STEP_GROUP_NAME\":\"상온 Aging3\",\"ENG_STEP_GROUP_NAME\":\"Normal Temp Aging3\",\"RACK_STEP_COUNT\":\"106\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"12.71\",\"TIMESTAMP\":\"2025-03-25T11:59:59.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8016\",\"KOR_STEP_GROUP_NAME\":\"상온 Aging4\",\"ENG_STEP_GROUP_NAME\":\"Normal Temp Aging4\",\"RACK_STEP_COUNT\":\"117\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"14.03\",\"TIMESTAMP\":\"2025-03-25T11:59:59.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8040\",\"KOR_STEP_GROUP_NAME\":\"출하 Aging\",\"ENG_STEP_GROUP_NAME\":\"G/I Aging\",\"RACK_STEP_COUNT\":\"215\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"25.78\",\"TIMESTAMP\":\"2025-03-25T11:59:59.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8042\",\"KOR_STEP_GROUP_NAME\":\"상온 Aging5\",\"ENG_STEP_GROUP_NAME\":\"Normal Temp Aging5\",\"RACK_STEP_COUNT\":\"3\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"0.36\",\"TIMESTAMP\":\"2025-03-25T11:59:59.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8044\",\"KOR_STEP_GROUP_NAME\":\"상온 Aging6\",\"ENG_STEP_GROUP_NAME\":\"Normal Temp Aging6\",\"RACK_STEP_COUNT\":\"6\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"0.72\",\"TIMESTAMP\":\"2025-03-25T11:59:59.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8045\",\"KOR_STEP_GROUP_NAME\":\"상온 Aging7\",\"ENG_STEP_GROUP_NAME\":\"Normal Temp Aging7\",\"RACK_STEP_COUNT\":\"21\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"2.52\",\"TIMESTAMP\":\"2025-03-25T11:59:59.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8046\",\"KOR_STEP_GROUP_NAME\":\"상온 Aging8\",\"ENG_STEP_GROUP_NAME\":\"Normal Temp Aging8\",\"RACK_STEP_COUNT\":\"3\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"0.36\",\"TIMESTAMP\":\"2025-03-25T11:59:59.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8190\",\"KOR_STEP_GROUP_NAME\":\"방치 AGING #1\",\"ENG_STEP_GROUP_NAME\":\"Boxing Aging 1\",\"RACK_STEP_COUNT\":\"1\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"0.12\",\"TIMESTAMP\":\"2025-03-25T11:59:59.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8400\",\"KOR_STEP_GROUP_NAME\":\"포장\",\"ENG_STEP_GROUP_NAME\":\"Packing\",\"RACK_STEP_COUNT\":\"76\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"9.11\",\"TIMESTAMP\":\"2025-03-25T11:59:59.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8132\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"88\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"10.55\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8245\",\"KOR_STEP_GROUP_NAME\":\"외관검사1\",\"ENG_STEP_GROUP_NAME\":\"External Inspection 1\",\"RACK_STEP_COUNT\":\"1\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"0.12\",\"TIMESTAMP\":\"2025-03-25T10:41:12.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8182\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"88\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"10.55\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8108\",\"KOR_STEP_GROUP_NAME\":\"출하 IR/OCV\",\"ENG_STEP_GROUP_NAME\":\"G/I IR/OCV\",\"RACK_STEP_COUNT\":\"1\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"0.12\",\"TIMESTAMP\":\"2025-03-25T11:04:49.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8102\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"88\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"10.55\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8192\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"88\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"10.55\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"0\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"44\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"5.28\",\"TIMESTAMP\":\"2025-03-25T11:59:59.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8047\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"88\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"10.55\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8104\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"88\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"10.55\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8024\",\"KOR_STEP_GROUP_NAME\":\"고온 Aging3\",\"ENG_STEP_GROUP_NAME\":\"High Temp Aging3\",\"RACK_STEP_COUNT\":\"1\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"0.12\",\"TIMESTAMP\":\"2025-03-25T09:08:25.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8130\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"88\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"10.55\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":null,\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"87\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"10.43\",\"TIMESTAMP\":\"2025-03-25T11:59:59.000Z\"}]},{\"STOCKER_NAME\":\"HFF09AGM0100\",\"CAPACITY\":\"95.43\",\"MAXIMUM_CAPACITY\":\"810\",\"TRAY_CAPACITY\":\"93.54\",\"MAXIMUM_TRAY_CAPACITY\":\"2430\",\"RACK_LOAD_COUNT\":\"773\",\"RACK_EMPTY_COUNT\":\"37\",\"RESERVATED_RETURN_COUNT\":\"9\",\"TRAY_COUNT\":\"2273\",\"TRAY_REWORK_COUNT_AVG\":\"6\",\"TRAY_REWORK_COUNT_MAX\":\"132\",\"TRAY_REWORK_COUNT_MIN\":\"0\",\"RACK_DISABLE_COUNT\":\"55\",\"KOR_EQP_NAME\":\"출하창고(Module Cell Aging) #01\",\"ENG_EQP_NAME\":\"출하창고(Module Cell Aging) #01\",\"TIMESTAMP\":\"2025-03-25T11:59:56.000Z\",\"STEP\":[{\"STOCKER_NAME\":\"HFF09AGM0100\",\"STEP_ID\":\"8040\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"38\",\"TOTAL\":\"810\",\"STEP_CAPACITY\":\"4.69\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGM0100\",\"STEP_ID\":\"0\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"38\",\"TOTAL\":\"810\",\"STEP_CAPACITY\":\"4.69\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGM0100\",\"STEP_ID\":\"8046\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"38\",\"TOTAL\":\"810\",\"STEP_CAPACITY\":\"4.69\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGM0100\",\"STEP_ID\":\"8192\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"38\",\"TOTAL\":\"810\",\"STEP_CAPACITY\":\"4.69\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGM0100\",\"STEP_ID\":\"8190\",\"KOR_STEP_GROUP_NAME\":\"방치 AGING #1\",\"ENG_STEP_GROUP_NAME\":\"Boxing Aging 1\",\"RACK_STEP_COUNT\":\"5\",\"TOTAL\":\"810\",\"STEP_CAPACITY\":\"0.62\",\"TIMESTAMP\":\"2025-03-25T11:59:59.000Z\"},{\"STOCKER_NAME\":\"HFF09AGM0100\",\"STEP_ID\":\"8400\",\"KOR_STEP_GROUP_NAME\":\"포장\",\"ENG_STEP_GROUP_NAME\":\"Packing\",\"RACK_STEP_COUNT\":\"768\",\"TOTAL\":\"810\",\"STEP_CAPACITY\":\"94.81\",\"TIMESTAMP\":\"2025-03-25T11:59:59.000Z\"},{\"STOCKER_NAME\":\"HFF09AGM0100\",\"STEP_ID\":\"8245\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"38\",\"TOTAL\":\"810\",\"STEP_CAPACITY\":\"4.69\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGM0100\",\"STEP_ID\":\"8106\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"38\",\"TOTAL\":\"810\",\"STEP_CAPACITY\":\"4.69\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGM0100\",\"STEP_ID\":\"8010\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"38\",\"TOTAL\":\"810\",\"STEP_CAPACITY\":\"4.69\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGM0100\",\"STEP_ID\":\"8182\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"38\",\"TOTAL\":\"810\",\"STEP_CAPACITY\":\"4.69\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGM0100\",\"STEP_ID\":\"8220\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"38\",\"TOTAL\":\"810\",\"STEP_CAPACITY\":\"4.69\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGM0100\",\"STEP_ID\":\"8014\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"38\",\"TOTAL\":\"810\",\"STEP_CAPACITY\":\"4.69\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGM0100\",\"STEP_ID\":\"8108\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"38\",\"TOTAL\":\"810\",\"STEP_CAPACITY\":\"4.69\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGM0100\",\"STEP_ID\":\"8250\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"38\",\"TOTAL\":\"810\",\"STEP_CAPACITY\":\"4.69\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGM0100\",\"STEP_ID\":\"8016\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"38\",\"TOTAL\":\"810\",\"STEP_CAPACITY\":\"4.69\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGM0100\",\"STEP_ID\":\"8047\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"38\",\"TOTAL\":\"810\",\"STEP_CAPACITY\":\"4.69\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGM0100\",\"STEP_ID\":null,\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"37\",\"TOTAL\":\"810\",\"STEP_CAPACITY\":\"4.57\",\"TIMESTAMP\":\"2025-03-25T11:59:59.000Z\"}]},{\"STOCKER_NAME\":\"HFF09AGH0100\",\"CAPACITY\":\"89.9\",\"MAXIMUM_CAPACITY\":\"406\",\"TRAY_CAPACITY\":\"88.59\",\"MAXIMUM_TRAY_CAPACITY\":\"1218\",\"RACK_LOAD_COUNT\":\"365\",\"RACK_EMPTY_COUNT\":\"41\",\"RESERVATED_RETURN_COUNT\":\"7\",\"TRAY_COUNT\":\"1079\",\"TRAY_REWORK_COUNT_AVG\":\"6\",\"TRAY_REWORK_COUNT_MAX\":\"64\",\"TRAY_REWORK_COUNT_MIN\":\"0\",\"RACK_DISABLE_COUNT\":\"0\",\"KOR_EQP_NAME\":\"고온Aging #01\",\"ENG_EQP_NAME\":\"고온Aging #01\",\"TIMESTAMP\":\"2025-03-25T11:59:56.000Z\",\"STEP\":[{\"STOCKER_NAME\":\"HFF09AGH0100\",\"STEP_ID\":\"8190\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"39\",\"TOTAL\":\"406\",\"STEP_CAPACITY\":\"9.61\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGH0100\",\"STEP_ID\":\"8040\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"39\",\"TOTAL\":\"406\",\"STEP_CAPACITY\":\"9.61\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGH0100\",\"STEP_ID\":\"8016\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"39\",\"TOTAL\":\"406\",\"STEP_CAPACITY\":\"9.61\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGH0100\",\"STEP_ID\":\"8020\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"39\",\"TOTAL\":\"406\",\"STEP_CAPACITY\":\"9.61\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGH0100\",\"STEP_ID\":\"8150\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"39\",\"TOTAL\":\"406\",\"STEP_CAPACITY\":\"9.61\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGH0100\",\"STEP_ID\":\"8024\",\"KOR_STEP_GROUP_NAME\":\"고온 Aging3\",\"ENG_STEP_GROUP_NAME\":\"High Temp Aging3\",\"RACK_STEP_COUNT\":\"251\",\"TOTAL\":\"406\",\"STEP_CAPACITY\":\"61.82\",\"TIMESTAMP\":\"2025-03-25T11:59:59.000Z\"},{\"STOCKER_NAME\":\"HFF09AGH0100\",\"STEP_ID\":\"8028\",\"KOR_STEP_GROUP_NAME\":\"고온 Aging5\",\"ENG_STEP_GROUP_NAME\":\"High Temp Aging5\",\"RACK_STEP_COUNT\":\"1\",\"TOTAL\":\"406\",\"STEP_CAPACITY\":\"0.25\",\"TIMESTAMP\":\"2025-03-25T11:59:59.000Z\"},{\"STOCKER_NAME\":\"HFF09AGH0100\",\"STEP_ID\":\"0\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"113\",\"TOTAL\":\"406\",\"STEP_CAPACITY\":\"27.83\",\"TIMESTAMP\":\"2025-03-25T11:59:59.000Z\"},{\"STOCKER_NAME\":\"HFF09AGH0100\",\"STEP_ID\":\"8025\",\"KOR_STEP_GROUP_NAME\":\"냉각 Aging3\",\"ENG_STEP_GROUP_NAME\":\"Cold Temp Aging3\",\"RACK_STEP_COUNT\":\"1\",\"TOTAL\":\"406\",\"STEP_CAPACITY\":\"0.25\",\"TIMESTAMP\":\"2025-03-25T11:23:53.000Z\"},{\"STOCKER_NAME\":\"HFF09AGH0100\",\"STEP_ID\":\"8022\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"39\",\"TOTAL\":\"406\",\"STEP_CAPACITY\":\"9.61\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGH0100\",\"STEP_ID\":\"8026\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"39\",\"TOTAL\":\"406\",\"STEP_CAPACITY\":\"9.61\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGH0100\",\"STEP_ID\":\"8029\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"39\",\"TOTAL\":\"406\",\"STEP_CAPACITY\":\"9.61\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGH0100\",\"STEP_ID\":null,\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"41\",\"TOTAL\":\"406\",\"STEP_CAPACITY\":\"10.1\",\"TIMESTAMP\":\"2025-03-25T11:59:59.000Z\"}]}],\r\n \"CARRIER\":[{\"MAIN_CARR_ID\":\"2F02365\",\"SUB_CARR_ID\":\"2F02365,2F70671,2F28723\",\"CARR_SEQ\":\"3\",\"CARR_USE\":\"EMPTY\",\"CURRENTPORT\":\"HFF09CNV0300_ABP3003\",\"CURRENTRACK\":null,\"MOVE_JOBID\":null,\"MOVESTATUS\":\"ARRIVED\",\"FINALTOOLID\":null,\"MOVEFLAG\":\"0\",\"PROD_ID\":null,\"FTY_NO\":null,\"WORK_TYPE\":null,\"MFG_TYPE\":null,\"PROD_DETAIL_CODE\":\"E3A\",\"STEP_ID\":null,\"NEXT_STEP_ID\":null,\"ASSIGN_LOT_QTY\":\"0\",\"FRMT_BATCH_ID\":null,\"CARR_SIZE_TYPE\":\"STACK3\",\"ABNM_VALUE\":\"0\",\"LINE_ID\":\"FM0I\",\"TIMESTAMP\":\"2025-03-25T11:59:57.000Z\",\"INPUT_QTY\":null,\"GOOD_QTY\":\"0\",\"BAD_QTY\":null,\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"NEXT_KOR_STEP_GROUP_NAME\":null,\"NEXT_ENG_STEP_GROUP_NAME\":null,\"LOT_ID\":null,\"CTH_REEL_ID\":null,\"ANODE_REEL_ID\":null,\"CARR_NO\":null,\"BATCH_GUBUN\":null,\"PROC_IN_TIME\":null,\"IN_CARR_QTY\":null,\"LAST_TKIN_TIME\":null,\"VHCL_ID\":null,\"FIRST_FRMT_INPUT_TIME\":null,\"CURRENTLOCATION\":\"HFF09CNV0300\",\"JOB_ID\":null,\"FROM_PORT\":null,\"TO_PORT\":null,\"TRANSPORT_JOB_TIMESTAMP\":null},{\"MAIN_CARR_ID\":\"2F50746\",\"SUB_CARR_ID\":\"2F50746,2F10132,2F53089\",\"CARR_SEQ\":\"3\",\"CARR_USE\":\"FULL\",\"CURRENTPORT\":\"HFF11AGN0100_UOP04\",\"CURRENTRACK\":null,\"MOVE_JOBID\":\"2F50746_398_7061037573669158\",\"MOVESTATUS\":\"ARRIVED\",\"FINALTOOLID\":\"HFB11CNV0100_UOP03\",\"MOVEFLAG\":\"1\",\"PROD_ID\":\"CP7024F111A\",\"FTY_NO\":\"70B0\",\"WORK_TYPE\":\"NM\",\"MFG_TYPE\":\"PP02\",\"PROD_DETAIL_CODE\":\"E3A\",\"STEP_ID\":\"8182\",\"NEXT_STEP_ID\":\"8250\",\"ASSIGN_LOT_QTY\":\"288\",\"FRMT_BATCH_ID\":\"H1I70SA253FG21\",\"CARR_SIZE_TYPE\":\"STACK3\",\"ABNM_VALUE\":\"0\",\"LINE_ID\":\"FM0I\",\"TIMESTAMP\":\"2025-03-25T11:59:53.000Z\",\"INPUT_QTY\":\"288\",\"GOOD_QTY\":\"288\",\"BAD_QTY\":null,\"KOR_STEP_GROUP_NAME\":\"방치 IR/OCV #2\",\"ENG_STEP_GROUP_NAME\":\"Boxing IR/OCV 2\",\"NEXT_KOR_STEP_GROUP_NAME\":\"외관검사\",\"NEXT_ENG_STEP_GROUP_NAME\":\"External Inspection\",\"LOT_ID\":\"36092531465248BKDS1B\",\"CTH_REEL_ID\":\"H16CP25312A115D\",\"ANODE_REEL_ID\":\"H16AP25312A131F\",\"CARR_NO\":\"H1I70SB252A313-3119\",\"BATCH_GUBUN\":\"PP02\",\"PROC_IN_TIME\":\"2025-03-14T06:06:39.000Z\",\"IN_CARR_QTY\":\"267\",\"LAST_TKIN_TIME\":\"2025-03-24T04:57:10.000Z\",\"VHCL_ID\":null,\"FIRST_FRMT_INPUT_TIME\":\"2025-03-14T06:06:42.000Z\",\"CURRENTLOCATION\":\"HFF11AGN0100\",\"JOB_ID\":\"2F50746_398_7061037573669158\",\"FROM_PORT\":\"HFF11AGN0100,null,0102111\",\"TO_PORT\":\"HFB11CNV0100,HFB11CNV0100_UOP03,null\",\"TRANSPORT_JOB_TIMESTAMP\":\"2025-03-25T11:59:53.000Z\"},{\"MAIN_CARR_ID\":\"2F52504\",\"SUB_CARR_ID\":\"2F52504,2F11450,2F51910\",\"CARR_SEQ\":\"3\",\"CARR_USE\":\"FULL\",\"CURRENTPORT\":\"HFF09CDS0200_UBP02\",\"CURRENTRACK\":null,\"MOVE_JOBID\":null,\"MOVESTATUS\":\"ARRIVED\",\"FINALTOOLID\":null,\"MOVEFLAG\":\"0\",\"PROD_ID\":\"CP7024F111A\",\"FTY_NO\":\"70B0\",\"WORK_TYPE\":\"NM\",\"MFG_TYPE\":\"PP02\",\"PROD_DETAIL_CODE\":\"E3A\",\"STEP_ID\":\"8024\",\"NEXT_STEP_ID\":\"8025\",\"ASSIGN_LOT_QTY\":\"288\",\"FRMT_BATCH_ID\":\"H1J70SA253HO22\",\"CARR_SIZE_TYPE\":\"STACK3\",\"ABNM_VALUE\":\"0\",\"LINE_ID\":\"FM0I\",\"TIMESTAMP\":\"2025-03-25T11:59:57.000Z\",\"INPUT_QTY\":\"288\",\"GOOD_QTY\":\"288\",\"BAD_QTY\":null,\"KOR_STEP_GROUP_NAME\":\"고온 Aging3\",\"ENG_STEP_GROUP_NAME\":\"High Temp Aging3\",\"NEXT_KOR_STEP_GROUP_NAME\":\"냉각 Aging3\",\"NEXT_ENG_STEP_GROUP_NAME\":\"Cold Temp Aging3\",\"LOT_ID\":\"36092532270707BKDS1B\",\"CTH_REEL_ID\":\"H16CP25310A118D\",\"ANODE_REEL_ID\":\"H16AP25321A113E\",\"CARR_NO\":\"H1J70SA251DC13-5524\",\"BATCH_GUBUN\":\"PP02\",\"PROC_IN_TIME\":\"2025-03-22T21:57:57.000Z\",\"IN_CARR_QTY\":\"288\",\"LAST_TKIN_TIME\":\"2025-03-25T09:46:35.000Z\",\"VHCL_ID\":null,\"FIRST_FRMT_INPUT_TIME\":\"2025-03-22T21:58:00.000Z\",\"CURRENTLOCATION\":\"HFF09CDS0200\",\"JOB_ID\":null,\"FROM_PORT\":null,\"TO_PORT\":null,\"TRANSPORT_JOB_TIMESTAMP\":\"2025-03-25T11:57:14.000Z\"}]\r\n}", + "{\r\n \"AGV\":[{\"VHL_NAME\":\"HFF09CNA8013\",\"AGV_IDX\":12,\"B_INSTALL\":\"Y\",\"NODE_ID\":235,\"REAL_ID\":235,\"VHL_STATE\":11,\"BAY_LIST\":\"21;\",\"X\":118301,\"Y\":20177,\"MODE\":1,\"BATT\":75,\"SUB_GOAL\":211,\"FINAL_GOAL\":1006,\"TIMESTAMP\":\"2025-03-25T12:00:00.980Z\",\"DEGREE\":181.2,\"CARRIER_ID\":null,\"STOP_STATE\":0,\"LOT_ID\":null,\"BATCH_ID\":null,\"CARRIER_TIMESTAMP\":null,\"JOB_ID\":\"2F24217_289_7038296224059039\",\"DESTINATION_PORT\":\"HFF09MPI0200_LIP01\",\"SOURCE_PORT\":\"HFF09AGM0100_UOP01\",\"FROM\":\"HFF09AGM0100,NULL,0201012\",\"TO\":\"HFF09MPI0200,HFF09MPI0200_LIP01,NULL\",\"TRANSPORT_JOB_TIMESTAMP\":\"2025-03-25T05:40:19.000Z\",\"FACTOR\":69.3,\"AGV_FACTOR_TIMESTAMP\":\"2025-03-25T11:59:04.000Z\"},{\"VHL_NAME\":\"HFF09CNA8047\",\"AGV_IDX\":46,\"B_INSTALL\":\"Y\",\"NODE_ID\":1022,\"REAL_ID\":1022,\"VHL_STATE\":12,\"BAY_LIST\":\"21;7;\",\"X\":184722,\"Y\":15032,\"MODE\":1,\"BATT\":37,\"SUB_GOAL\":1022,\"FINAL_GOAL\":1022,\"TIMESTAMP\":\"2025-03-25T12:00:00.979Z\",\"DEGREE\":89.5,\"CARRIER_ID\":null,\"STOP_STATE\":0,\"LOT_ID\":null,\"BATCH_ID\":null,\"CARRIER_TIMESTAMP\":null,\"JOB_ID\":null,\"DESTINATION_PORT\":null,\"SOURCE_PORT\":null,\"FROM\":null,\"TO\":null,\"TRANSPORT_JOB_TIMESTAMP\":null,\"FACTOR\":46.27,\"AGV_FACTOR_TIMESTAMP\":\"2025-03-25T11:59:04.000Z\"},{\"VHL_NAME\":\"HFF09CNA8086\",\"AGV_IDX\":85,\"B_INSTALL\":\"Y\",\"NODE_ID\":81016,\"REAL_ID\":81016,\"VHL_STATE\":11,\"BAY_LIST\":\"9;\",\"X\":413564,\"Y\":46530,\"MODE\":1,\"BATT\":85,\"SUB_GOAL\":849,\"FINAL_GOAL\":849,\"TIMESTAMP\":\"2025-03-25T11:59:59.978Z\",\"DEGREE\":359.2,\"CARRIER_ID\":null,\"STOP_STATE\":0,\"LOT_ID\":null,\"BATCH_ID\":null,\"CARRIER_TIMESTAMP\":null,\"JOB_ID\":null,\"DESTINATION_PORT\":null,\"SOURCE_PORT\":null,\"FROM\":null,\"TO\":null,\"TRANSPORT_JOB_TIMESTAMP\":null,\"FACTOR\":69.93,\"AGV_FACTOR_TIMESTAMP\":\"2025-03-25T11:59:04.000Z\"}],\r\n \"STOCKER_STACK\":[{\"STOCKER_NAME\":\"HFF09AGN0300\",\"CAPACITY\":\"89.57\",\"MAXIMUM_CAPACITY\":\"834\",\"TRAY_CAPACITY\":\"83.25\",\"MAXIMUM_TRAY_CAPACITY\":\"2502\",\"RACK_LOAD_COUNT\":\"747\",\"RACK_EMPTY_COUNT\":\"87\",\"RESERVATED_RETURN_COUNT\":\"5\",\"TRAY_COUNT\":\"2083\",\"TRAY_REWORK_COUNT_AVG\":\"3\",\"TRAY_REWORK_COUNT_MAX\":\"153\",\"TRAY_REWORK_COUNT_MIN\":\"0\",\"RACK_DISABLE_COUNT\":\"4\",\"KOR_EQP_NAME\":\"상온Aging #03\",\"ENG_EQP_NAME\":\"상온Aging #03\",\"TIMESTAMP\":\"2025-03-25T11:59:56.000Z\",\"STEP\":[{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8106\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"88\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"10.55\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8220\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"88\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"10.55\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8100\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"88\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"10.55\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8038\",\"KOR_STEP_GROUP_NAME\":\"디게싱에이징1\",\"ENG_STEP_GROUP_NAME\":\"Deggassing Aging1\",\"RACK_STEP_COUNT\":\"8\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"0.96\",\"TIMESTAMP\":\"2025-03-25T12:00:00.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8150\",\"KOR_STEP_GROUP_NAME\":\"용량검사\",\"ENG_STEP_GROUP_NAME\":\"Capacity Inspection\",\"RACK_STEP_COUNT\":\"1\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"0.12\",\"TIMESTAMP\":\"2025-03-25T11:21:18.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8136\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"88\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"10.55\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8134\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"88\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"10.55\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8116\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"88\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"10.55\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8028\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"88\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"10.55\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8012\",\"KOR_STEP_GROUP_NAME\":\"상온 Aging2\",\"ENG_STEP_GROUP_NAME\":\"Normal Temp Aging2\",\"RACK_STEP_COUNT\":\"24\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"2.88\",\"TIMESTAMP\":\"2025-03-25T12:00:00.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8057\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"88\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"10.55\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8070\",\"KOR_STEP_GROUP_NAME\":\"호퍼 pre-c 전 임시밀폐제거\",\"ENG_STEP_GROUP_NAME\":\"Temp Sealing Remove(Pre-C)\",\"RACK_STEP_COUNT\":\"1\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"0.12\",\"TIMESTAMP\":\"2025-03-25T10:56:56.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8140\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"88\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"10.55\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8138\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"88\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"10.55\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8025\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"88\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"10.55\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8010\",\"KOR_STEP_GROUP_NAME\":\"상온 Aging1\",\"ENG_STEP_GROUP_NAME\":\"Normal Temp Aging1\",\"RACK_STEP_COUNT\":\"123\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"14.75\",\"TIMESTAMP\":\"2025-03-25T12:00:00.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8014\",\"KOR_STEP_GROUP_NAME\":\"상온 Aging3\",\"ENG_STEP_GROUP_NAME\":\"Normal Temp Aging3\",\"RACK_STEP_COUNT\":\"106\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"12.71\",\"TIMESTAMP\":\"2025-03-25T12:00:00.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8016\",\"KOR_STEP_GROUP_NAME\":\"상온 Aging4\",\"ENG_STEP_GROUP_NAME\":\"Normal Temp Aging4\",\"RACK_STEP_COUNT\":\"117\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"14.03\",\"TIMESTAMP\":\"2025-03-25T12:00:00.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8040\",\"KOR_STEP_GROUP_NAME\":\"출하 Aging\",\"ENG_STEP_GROUP_NAME\":\"G/I Aging\",\"RACK_STEP_COUNT\":\"215\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"25.78\",\"TIMESTAMP\":\"2025-03-25T12:00:00.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8042\",\"KOR_STEP_GROUP_NAME\":\"상온 Aging5\",\"ENG_STEP_GROUP_NAME\":\"Normal Temp Aging5\",\"RACK_STEP_COUNT\":\"3\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"0.36\",\"TIMESTAMP\":\"2025-03-25T12:00:00.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8044\",\"KOR_STEP_GROUP_NAME\":\"상온 Aging6\",\"ENG_STEP_GROUP_NAME\":\"Normal Temp Aging6\",\"RACK_STEP_COUNT\":\"6\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"0.72\",\"TIMESTAMP\":\"2025-03-25T12:00:00.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8045\",\"KOR_STEP_GROUP_NAME\":\"상온 Aging7\",\"ENG_STEP_GROUP_NAME\":\"Normal Temp Aging7\",\"RACK_STEP_COUNT\":\"21\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"2.52\",\"TIMESTAMP\":\"2025-03-25T12:00:00.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8046\",\"KOR_STEP_GROUP_NAME\":\"상온 Aging8\",\"ENG_STEP_GROUP_NAME\":\"Normal Temp Aging8\",\"RACK_STEP_COUNT\":\"3\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"0.36\",\"TIMESTAMP\":\"2025-03-25T12:00:00.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8190\",\"KOR_STEP_GROUP_NAME\":\"방치 AGING #1\",\"ENG_STEP_GROUP_NAME\":\"Boxing Aging 1\",\"RACK_STEP_COUNT\":\"1\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"0.12\",\"TIMESTAMP\":\"2025-03-25T12:00:00.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8400\",\"KOR_STEP_GROUP_NAME\":\"포장\",\"ENG_STEP_GROUP_NAME\":\"Packing\",\"RACK_STEP_COUNT\":\"76\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"9.11\",\"TIMESTAMP\":\"2025-03-25T12:00:00.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8132\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"88\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"10.55\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8245\",\"KOR_STEP_GROUP_NAME\":\"외관검사1\",\"ENG_STEP_GROUP_NAME\":\"External Inspection 1\",\"RACK_STEP_COUNT\":\"1\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"0.12\",\"TIMESTAMP\":\"2025-03-25T10:41:12.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8182\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"88\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"10.55\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8108\",\"KOR_STEP_GROUP_NAME\":\"출하 IR/OCV\",\"ENG_STEP_GROUP_NAME\":\"G/I IR/OCV\",\"RACK_STEP_COUNT\":\"1\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"0.12\",\"TIMESTAMP\":\"2025-03-25T11:04:49.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8102\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"88\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"10.55\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8192\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"88\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"10.55\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"0\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"44\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"5.28\",\"TIMESTAMP\":\"2025-03-25T12:00:00.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8047\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"88\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"10.55\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8104\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"88\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"10.55\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8024\",\"KOR_STEP_GROUP_NAME\":\"고온 Aging3\",\"ENG_STEP_GROUP_NAME\":\"High Temp Aging3\",\"RACK_STEP_COUNT\":\"1\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"0.12\",\"TIMESTAMP\":\"2025-03-25T09:08:25.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8130\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"88\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"10.55\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":null,\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"87\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"10.43\",\"TIMESTAMP\":\"2025-03-25T12:00:00.000Z\"}]},{\"STOCKER_NAME\":\"HFF09AGM0100\",\"CAPACITY\":\"95.43\",\"MAXIMUM_CAPACITY\":\"810\",\"TRAY_CAPACITY\":\"93.54\",\"MAXIMUM_TRAY_CAPACITY\":\"2430\",\"RACK_LOAD_COUNT\":\"773\",\"RACK_EMPTY_COUNT\":\"37\",\"RESERVATED_RETURN_COUNT\":\"9\",\"TRAY_COUNT\":\"2273\",\"TRAY_REWORK_COUNT_AVG\":\"6\",\"TRAY_REWORK_COUNT_MAX\":\"132\",\"TRAY_REWORK_COUNT_MIN\":\"0\",\"RACK_DISABLE_COUNT\":\"55\",\"KOR_EQP_NAME\":\"출하창고(Module Cell Aging) #01\",\"ENG_EQP_NAME\":\"출하창고(Module Cell Aging) #01\",\"TIMESTAMP\":\"2025-03-25T11:59:56.000Z\",\"STEP\":[{\"STOCKER_NAME\":\"HFF09AGM0100\",\"STEP_ID\":\"8040\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"38\",\"TOTAL\":\"810\",\"STEP_CAPACITY\":\"4.69\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGM0100\",\"STEP_ID\":\"0\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"38\",\"TOTAL\":\"810\",\"STEP_CAPACITY\":\"4.69\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGM0100\",\"STEP_ID\":\"8046\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"38\",\"TOTAL\":\"810\",\"STEP_CAPACITY\":\"4.69\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGM0100\",\"STEP_ID\":\"8192\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"38\",\"TOTAL\":\"810\",\"STEP_CAPACITY\":\"4.69\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGM0100\",\"STEP_ID\":\"8190\",\"KOR_STEP_GROUP_NAME\":\"방치 AGING #1\",\"ENG_STEP_GROUP_NAME\":\"Boxing Aging 1\",\"RACK_STEP_COUNT\":\"5\",\"TOTAL\":\"810\",\"STEP_CAPACITY\":\"0.62\",\"TIMESTAMP\":\"2025-03-25T12:00:00.000Z\"},{\"STOCKER_NAME\":\"HFF09AGM0100\",\"STEP_ID\":\"8400\",\"KOR_STEP_GROUP_NAME\":\"포장\",\"ENG_STEP_GROUP_NAME\":\"Packing\",\"RACK_STEP_COUNT\":\"768\",\"TOTAL\":\"810\",\"STEP_CAPACITY\":\"94.81\",\"TIMESTAMP\":\"2025-03-25T12:00:00.000Z\"},{\"STOCKER_NAME\":\"HFF09AGM0100\",\"STEP_ID\":\"8245\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"38\",\"TOTAL\":\"810\",\"STEP_CAPACITY\":\"4.69\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGM0100\",\"STEP_ID\":\"8106\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"38\",\"TOTAL\":\"810\",\"STEP_CAPACITY\":\"4.69\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGM0100\",\"STEP_ID\":\"8010\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"38\",\"TOTAL\":\"810\",\"STEP_CAPACITY\":\"4.69\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGM0100\",\"STEP_ID\":\"8182\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"38\",\"TOTAL\":\"810\",\"STEP_CAPACITY\":\"4.69\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGM0100\",\"STEP_ID\":\"8220\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"38\",\"TOTAL\":\"810\",\"STEP_CAPACITY\":\"4.69\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGM0100\",\"STEP_ID\":\"8014\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"38\",\"TOTAL\":\"810\",\"STEP_CAPACITY\":\"4.69\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGM0100\",\"STEP_ID\":\"8108\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"38\",\"TOTAL\":\"810\",\"STEP_CAPACITY\":\"4.69\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGM0100\",\"STEP_ID\":\"8250\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"38\",\"TOTAL\":\"810\",\"STEP_CAPACITY\":\"4.69\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGM0100\",\"STEP_ID\":\"8016\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"38\",\"TOTAL\":\"810\",\"STEP_CAPACITY\":\"4.69\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGM0100\",\"STEP_ID\":\"8047\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"38\",\"TOTAL\":\"810\",\"STEP_CAPACITY\":\"4.69\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGM0100\",\"STEP_ID\":null,\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"37\",\"TOTAL\":\"810\",\"STEP_CAPACITY\":\"4.57\",\"TIMESTAMP\":\"2025-03-25T12:00:00.000Z\"}]},{\"STOCKER_NAME\":\"HFF09AGH0100\",\"CAPACITY\":\"89.9\",\"MAXIMUM_CAPACITY\":\"406\",\"TRAY_CAPACITY\":\"88.59\",\"MAXIMUM_TRAY_CAPACITY\":\"1218\",\"RACK_LOAD_COUNT\":\"365\",\"RACK_EMPTY_COUNT\":\"41\",\"RESERVATED_RETURN_COUNT\":\"7\",\"TRAY_COUNT\":\"1079\",\"TRAY_REWORK_COUNT_AVG\":\"6\",\"TRAY_REWORK_COUNT_MAX\":\"64\",\"TRAY_REWORK_COUNT_MIN\":\"0\",\"RACK_DISABLE_COUNT\":\"0\",\"KOR_EQP_NAME\":\"고온Aging #01\",\"ENG_EQP_NAME\":\"고온Aging #01\",\"TIMESTAMP\":\"2025-03-25T11:59:56.000Z\",\"STEP\":[{\"STOCKER_NAME\":\"HFF09AGH0100\",\"STEP_ID\":\"8190\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"39\",\"TOTAL\":\"406\",\"STEP_CAPACITY\":\"9.61\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGH0100\",\"STEP_ID\":\"8040\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"39\",\"TOTAL\":\"406\",\"STEP_CAPACITY\":\"9.61\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGH0100\",\"STEP_ID\":\"8016\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"39\",\"TOTAL\":\"406\",\"STEP_CAPACITY\":\"9.61\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGH0100\",\"STEP_ID\":\"8020\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"39\",\"TOTAL\":\"406\",\"STEP_CAPACITY\":\"9.61\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGH0100\",\"STEP_ID\":\"8150\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"39\",\"TOTAL\":\"406\",\"STEP_CAPACITY\":\"9.61\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGH0100\",\"STEP_ID\":\"8024\",\"KOR_STEP_GROUP_NAME\":\"고온 Aging3\",\"ENG_STEP_GROUP_NAME\":\"High Temp Aging3\",\"RACK_STEP_COUNT\":\"251\",\"TOTAL\":\"406\",\"STEP_CAPACITY\":\"61.82\",\"TIMESTAMP\":\"2025-03-25T12:00:00.000Z\"},{\"STOCKER_NAME\":\"HFF09AGH0100\",\"STEP_ID\":\"8028\",\"KOR_STEP_GROUP_NAME\":\"고온 Aging5\",\"ENG_STEP_GROUP_NAME\":\"High Temp Aging5\",\"RACK_STEP_COUNT\":\"1\",\"TOTAL\":\"406\",\"STEP_CAPACITY\":\"0.25\",\"TIMESTAMP\":\"2025-03-25T12:00:00.000Z\"},{\"STOCKER_NAME\":\"HFF09AGH0100\",\"STEP_ID\":\"0\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"113\",\"TOTAL\":\"406\",\"STEP_CAPACITY\":\"27.83\",\"TIMESTAMP\":\"2025-03-25T12:00:00.000Z\"},{\"STOCKER_NAME\":\"HFF09AGH0100\",\"STEP_ID\":\"8025\",\"KOR_STEP_GROUP_NAME\":\"냉각 Aging3\",\"ENG_STEP_GROUP_NAME\":\"Cold Temp Aging3\",\"RACK_STEP_COUNT\":\"1\",\"TOTAL\":\"406\",\"STEP_CAPACITY\":\"0.25\",\"TIMESTAMP\":\"2025-03-25T11:23:53.000Z\"},{\"STOCKER_NAME\":\"HFF09AGH0100\",\"STEP_ID\":\"8022\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"39\",\"TOTAL\":\"406\",\"STEP_CAPACITY\":\"9.61\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGH0100\",\"STEP_ID\":\"8026\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"39\",\"TOTAL\":\"406\",\"STEP_CAPACITY\":\"9.61\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGH0100\",\"STEP_ID\":\"8029\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"39\",\"TOTAL\":\"406\",\"STEP_CAPACITY\":\"9.61\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGH0100\",\"STEP_ID\":null,\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"41\",\"TOTAL\":\"406\",\"STEP_CAPACITY\":\"10.1\",\"TIMESTAMP\":\"2025-03-25T12:00:00.000Z\"}]}],\r\n \"CARRIER\":[{\"MAIN_CARR_ID\":\"2F02365\",\"SUB_CARR_ID\":\"2F02365,2F70671,2F28723\",\"CARR_SEQ\":\"3\",\"CARR_USE\":\"EMPTY\",\"CURRENTPORT\":\"HFF09CNV0300_ABP3003\",\"CURRENTRACK\":null,\"MOVE_JOBID\":null,\"MOVESTATUS\":\"ARRIVED\",\"FINALTOOLID\":null,\"MOVEFLAG\":\"0\",\"PROD_ID\":null,\"FTY_NO\":null,\"WORK_TYPE\":null,\"MFG_TYPE\":null,\"PROD_DETAIL_CODE\":\"E3A\",\"STEP_ID\":null,\"NEXT_STEP_ID\":null,\"ASSIGN_LOT_QTY\":\"0\",\"FRMT_BATCH_ID\":null,\"CARR_SIZE_TYPE\":\"STACK3\",\"ABNM_VALUE\":\"0\",\"LINE_ID\":\"FM0I\",\"TIMESTAMP\":\"2025-03-25T11:59:57.000Z\",\"INPUT_QTY\":null,\"GOOD_QTY\":\"0\",\"BAD_QTY\":null,\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"NEXT_KOR_STEP_GROUP_NAME\":null,\"NEXT_ENG_STEP_GROUP_NAME\":null,\"LOT_ID\":null,\"CTH_REEL_ID\":null,\"ANODE_REEL_ID\":null,\"CARR_NO\":null,\"BATCH_GUBUN\":null,\"PROC_IN_TIME\":null,\"IN_CARR_QTY\":null,\"LAST_TKIN_TIME\":null,\"VHCL_ID\":null,\"FIRST_FRMT_INPUT_TIME\":null,\"CURRENTLOCATION\":\"HFF09CNV0300\",\"JOB_ID\":null,\"FROM_PORT\":null,\"TO_PORT\":null,\"TRANSPORT_JOB_TIMESTAMP\":null},{\"MAIN_CARR_ID\":\"2F52504\",\"SUB_CARR_ID\":\"2F52504,2F11450,2F51910\",\"CARR_SEQ\":\"3\",\"CARR_USE\":\"FULL\",\"CURRENTPORT\":\"HFF09CDS0200_UBP02\",\"CURRENTRACK\":null,\"MOVE_JOBID\":null,\"MOVESTATUS\":\"ARRIVED\",\"FINALTOOLID\":null,\"MOVEFLAG\":\"0\",\"PROD_ID\":\"CP7024F111A\",\"FTY_NO\":\"70B0\",\"WORK_TYPE\":\"NM\",\"MFG_TYPE\":\"PP02\",\"PROD_DETAIL_CODE\":\"E3A\",\"STEP_ID\":\"8024\",\"NEXT_STEP_ID\":\"8025\",\"ASSIGN_LOT_QTY\":\"288\",\"FRMT_BATCH_ID\":\"H1J70SA253HO22\",\"CARR_SIZE_TYPE\":\"STACK3\",\"ABNM_VALUE\":\"0\",\"LINE_ID\":\"FM0I\",\"TIMESTAMP\":\"2025-03-25T11:59:57.000Z\",\"INPUT_QTY\":\"288\",\"GOOD_QTY\":\"288\",\"BAD_QTY\":null,\"KOR_STEP_GROUP_NAME\":\"고온 Aging3\",\"ENG_STEP_GROUP_NAME\":\"High Temp Aging3\",\"NEXT_KOR_STEP_GROUP_NAME\":\"냉각 Aging3\",\"NEXT_ENG_STEP_GROUP_NAME\":\"Cold Temp Aging3\",\"LOT_ID\":\"36092532270707BKDS1B\",\"CTH_REEL_ID\":\"H16CP25310A118D\",\"ANODE_REEL_ID\":\"H16AP25321A113E\",\"CARR_NO\":\"H1J70SA251DC13-5524\",\"BATCH_GUBUN\":\"PP02\",\"PROC_IN_TIME\":\"2025-03-22T21:57:57.000Z\",\"IN_CARR_QTY\":\"288\",\"LAST_TKIN_TIME\":\"2025-03-25T09:46:35.000Z\",\"VHCL_ID\":null,\"FIRST_FRMT_INPUT_TIME\":\"2025-03-22T21:58:00.000Z\",\"CURRENTLOCATION\":\"HFF09CDS0200\",\"JOB_ID\":null,\"FROM_PORT\":null,\"TO_PORT\":null,\"TRANSPORT_JOB_TIMESTAMP\":\"2025-03-25T11:57:14.000Z\"}]\r\n}", + "{\r\n \"AGV\":[{\"VHL_NAME\":\"HFF09CNA8013\",\"AGV_IDX\":12,\"B_INSTALL\":\"Y\",\"NODE_ID\":235,\"REAL_ID\":235,\"VHL_STATE\":11,\"BAY_LIST\":\"21;\",\"X\":118301,\"Y\":20177,\"MODE\":1,\"BATT\":75,\"SUB_GOAL\":211,\"FINAL_GOAL\":1006,\"TIMESTAMP\":\"2025-03-25T12:00:00.980Z\",\"DEGREE\":181.2,\"CARRIER_ID\":null,\"STOP_STATE\":0,\"LOT_ID\":null,\"BATCH_ID\":null,\"CARRIER_TIMESTAMP\":null,\"JOB_ID\":\"2F24217_289_7038296224059039\",\"DESTINATION_PORT\":\"HFF09MPI0200_LIP01\",\"SOURCE_PORT\":\"HFF09AGM0100_UOP01\",\"FROM\":\"HFF09AGM0100,NULL,0201012\",\"TO\":\"HFF09MPI0200,HFF09MPI0200_LIP01,NULL\",\"TRANSPORT_JOB_TIMESTAMP\":\"2025-03-25T05:40:19.000Z\",\"FACTOR\":69.3,\"AGV_FACTOR_TIMESTAMP\":\"2025-03-25T11:59:04.000Z\"},{\"VHL_NAME\":\"HFF09CNA8047\",\"AGV_IDX\":46,\"B_INSTALL\":\"Y\",\"NODE_ID\":1022,\"REAL_ID\":1022,\"VHL_STATE\":12,\"BAY_LIST\":\"21;7;\",\"X\":184722,\"Y\":15032,\"MODE\":1,\"BATT\":37,\"SUB_GOAL\":1022,\"FINAL_GOAL\":1022,\"TIMESTAMP\":\"2025-03-25T12:00:00.979Z\",\"DEGREE\":89.5,\"CARRIER_ID\":null,\"STOP_STATE\":0,\"LOT_ID\":null,\"BATCH_ID\":null,\"CARRIER_TIMESTAMP\":null,\"JOB_ID\":null,\"DESTINATION_PORT\":null,\"SOURCE_PORT\":null,\"FROM\":null,\"TO\":null,\"TRANSPORT_JOB_TIMESTAMP\":null,\"FACTOR\":46.27,\"AGV_FACTOR_TIMESTAMP\":\"2025-03-25T11:59:04.000Z\"},{\"VHL_NAME\":\"HFF09CNA8086\",\"AGV_IDX\":85,\"B_INSTALL\":\"Y\",\"NODE_ID\":81016,\"REAL_ID\":81016,\"VHL_STATE\":11,\"BAY_LIST\":\"9;\",\"X\":413564,\"Y\":46530,\"MODE\":1,\"BATT\":85,\"SUB_GOAL\":849,\"FINAL_GOAL\":849,\"TIMESTAMP\":\"2025-03-25T11:59:59.978Z\",\"DEGREE\":359.2,\"CARRIER_ID\":null,\"STOP_STATE\":0,\"LOT_ID\":null,\"BATCH_ID\":null,\"CARRIER_TIMESTAMP\":null,\"JOB_ID\":null,\"DESTINATION_PORT\":null,\"SOURCE_PORT\":null,\"FROM\":null,\"TO\":null,\"TRANSPORT_JOB_TIMESTAMP\":null,\"FACTOR\":69.93,\"AGV_FACTOR_TIMESTAMP\":\"2025-03-25T11:59:04.000Z\"}],\r\n \"STOCKER_STACK\":[{\"STOCKER_NAME\":\"HFF09AGN0300\",\"CAPACITY\":\"89.57\",\"MAXIMUM_CAPACITY\":\"834\",\"TRAY_CAPACITY\":\"83.25\",\"MAXIMUM_TRAY_CAPACITY\":\"2502\",\"RACK_LOAD_COUNT\":\"747\",\"RACK_EMPTY_COUNT\":\"87\",\"RESERVATED_RETURN_COUNT\":\"5\",\"TRAY_COUNT\":\"2083\",\"TRAY_REWORK_COUNT_AVG\":\"3\",\"TRAY_REWORK_COUNT_MAX\":\"153\",\"TRAY_REWORK_COUNT_MIN\":\"0\",\"RACK_DISABLE_COUNT\":\"4\",\"KOR_EQP_NAME\":\"상온Aging #03\",\"ENG_EQP_NAME\":\"상온Aging #03\",\"TIMESTAMP\":\"2025-03-25T12:00:00.000Z\",\"STEP\":[{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8106\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"88\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"10.55\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8220\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"88\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"10.55\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8100\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"88\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"10.55\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8038\",\"KOR_STEP_GROUP_NAME\":\"디게싱에이징1\",\"ENG_STEP_GROUP_NAME\":\"Deggassing Aging1\",\"RACK_STEP_COUNT\":\"8\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"0.96\",\"TIMESTAMP\":\"2025-03-25T12:00:01.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8150\",\"KOR_STEP_GROUP_NAME\":\"용량검사\",\"ENG_STEP_GROUP_NAME\":\"Capacity Inspection\",\"RACK_STEP_COUNT\":\"1\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"0.12\",\"TIMESTAMP\":\"2025-03-25T11:21:18.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8136\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"88\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"10.55\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8134\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"88\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"10.55\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8116\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"88\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"10.55\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8028\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"88\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"10.55\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8012\",\"KOR_STEP_GROUP_NAME\":\"상온 Aging2\",\"ENG_STEP_GROUP_NAME\":\"Normal Temp Aging2\",\"RACK_STEP_COUNT\":\"24\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"2.88\",\"TIMESTAMP\":\"2025-03-25T12:00:01.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8057\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"88\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"10.55\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8070\",\"KOR_STEP_GROUP_NAME\":\"호퍼 pre-c 전 임시밀폐제거\",\"ENG_STEP_GROUP_NAME\":\"Temp Sealing Remove(Pre-C)\",\"RACK_STEP_COUNT\":\"1\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"0.12\",\"TIMESTAMP\":\"2025-03-25T10:56:56.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8140\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"88\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"10.55\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8138\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"88\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"10.55\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8025\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"88\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"10.55\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8010\",\"KOR_STEP_GROUP_NAME\":\"상온 Aging1\",\"ENG_STEP_GROUP_NAME\":\"Normal Temp Aging1\",\"RACK_STEP_COUNT\":\"123\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"14.75\",\"TIMESTAMP\":\"2025-03-25T12:00:01.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8014\",\"KOR_STEP_GROUP_NAME\":\"상온 Aging3\",\"ENG_STEP_GROUP_NAME\":\"Normal Temp Aging3\",\"RACK_STEP_COUNT\":\"106\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"12.71\",\"TIMESTAMP\":\"2025-03-25T12:00:01.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8016\",\"KOR_STEP_GROUP_NAME\":\"상온 Aging4\",\"ENG_STEP_GROUP_NAME\":\"Normal Temp Aging4\",\"RACK_STEP_COUNT\":\"117\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"14.03\",\"TIMESTAMP\":\"2025-03-25T12:00:01.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8040\",\"KOR_STEP_GROUP_NAME\":\"출하 Aging\",\"ENG_STEP_GROUP_NAME\":\"G/I Aging\",\"RACK_STEP_COUNT\":\"215\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"25.78\",\"TIMESTAMP\":\"2025-03-25T12:00:01.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8042\",\"KOR_STEP_GROUP_NAME\":\"상온 Aging5\",\"ENG_STEP_GROUP_NAME\":\"Normal Temp Aging5\",\"RACK_STEP_COUNT\":\"3\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"0.36\",\"TIMESTAMP\":\"2025-03-25T12:00:01.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8044\",\"KOR_STEP_GROUP_NAME\":\"상온 Aging6\",\"ENG_STEP_GROUP_NAME\":\"Normal Temp Aging6\",\"RACK_STEP_COUNT\":\"6\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"0.72\",\"TIMESTAMP\":\"2025-03-25T12:00:01.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8045\",\"KOR_STEP_GROUP_NAME\":\"상온 Aging7\",\"ENG_STEP_GROUP_NAME\":\"Normal Temp Aging7\",\"RACK_STEP_COUNT\":\"21\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"2.52\",\"TIMESTAMP\":\"2025-03-25T12:00:01.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8046\",\"KOR_STEP_GROUP_NAME\":\"상온 Aging8\",\"ENG_STEP_GROUP_NAME\":\"Normal Temp Aging8\",\"RACK_STEP_COUNT\":\"3\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"0.36\",\"TIMESTAMP\":\"2025-03-25T12:00:01.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8190\",\"KOR_STEP_GROUP_NAME\":\"방치 AGING #1\",\"ENG_STEP_GROUP_NAME\":\"Boxing Aging 1\",\"RACK_STEP_COUNT\":\"1\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"0.12\",\"TIMESTAMP\":\"2025-03-25T12:00:01.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8400\",\"KOR_STEP_GROUP_NAME\":\"포장\",\"ENG_STEP_GROUP_NAME\":\"Packing\",\"RACK_STEP_COUNT\":\"76\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"9.11\",\"TIMESTAMP\":\"2025-03-25T12:00:01.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8132\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"88\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"10.55\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8245\",\"KOR_STEP_GROUP_NAME\":\"외관검사1\",\"ENG_STEP_GROUP_NAME\":\"External Inspection 1\",\"RACK_STEP_COUNT\":\"1\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"0.12\",\"TIMESTAMP\":\"2025-03-25T10:41:12.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8182\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"88\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"10.55\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8108\",\"KOR_STEP_GROUP_NAME\":\"출하 IR/OCV\",\"ENG_STEP_GROUP_NAME\":\"G/I IR/OCV\",\"RACK_STEP_COUNT\":\"1\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"0.12\",\"TIMESTAMP\":\"2025-03-25T11:04:49.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8102\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"88\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"10.55\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8192\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"88\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"10.55\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"0\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"44\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"5.28\",\"TIMESTAMP\":\"2025-03-25T12:00:01.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8047\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"88\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"10.55\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8104\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"88\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"10.55\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8024\",\"KOR_STEP_GROUP_NAME\":\"고온 Aging3\",\"ENG_STEP_GROUP_NAME\":\"High Temp Aging3\",\"RACK_STEP_COUNT\":\"1\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"0.12\",\"TIMESTAMP\":\"2025-03-25T09:08:25.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":\"8130\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"88\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"10.55\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGN0300\",\"STEP_ID\":null,\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"87\",\"TOTAL\":\"834\",\"STEP_CAPACITY\":\"10.43\",\"TIMESTAMP\":\"2025-03-25T12:00:01.000Z\"}]},{\"STOCKER_NAME\":\"HFF09AGM0100\",\"CAPACITY\":\"95.43\",\"MAXIMUM_CAPACITY\":\"810\",\"TRAY_CAPACITY\":\"93.54\",\"MAXIMUM_TRAY_CAPACITY\":\"2430\",\"RACK_LOAD_COUNT\":\"773\",\"RACK_EMPTY_COUNT\":\"37\",\"RESERVATED_RETURN_COUNT\":\"9\",\"TRAY_COUNT\":\"2273\",\"TRAY_REWORK_COUNT_AVG\":\"6\",\"TRAY_REWORK_COUNT_MAX\":\"132\",\"TRAY_REWORK_COUNT_MIN\":\"0\",\"RACK_DISABLE_COUNT\":\"55\",\"KOR_EQP_NAME\":\"출하창고(Module Cell Aging) #01\",\"ENG_EQP_NAME\":\"출하창고(Module Cell Aging) #01\",\"TIMESTAMP\":\"2025-03-25T12:00:00.000Z\",\"STEP\":[{\"STOCKER_NAME\":\"HFF09AGM0100\",\"STEP_ID\":\"8040\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"38\",\"TOTAL\":\"810\",\"STEP_CAPACITY\":\"4.69\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGM0100\",\"STEP_ID\":\"0\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"38\",\"TOTAL\":\"810\",\"STEP_CAPACITY\":\"4.69\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGM0100\",\"STEP_ID\":\"8046\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"38\",\"TOTAL\":\"810\",\"STEP_CAPACITY\":\"4.69\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGM0100\",\"STEP_ID\":\"8192\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"38\",\"TOTAL\":\"810\",\"STEP_CAPACITY\":\"4.69\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGM0100\",\"STEP_ID\":\"8190\",\"KOR_STEP_GROUP_NAME\":\"방치 AGING #1\",\"ENG_STEP_GROUP_NAME\":\"Boxing Aging 1\",\"RACK_STEP_COUNT\":\"5\",\"TOTAL\":\"810\",\"STEP_CAPACITY\":\"0.62\",\"TIMESTAMP\":\"2025-03-25T12:00:01.000Z\"},{\"STOCKER_NAME\":\"HFF09AGM0100\",\"STEP_ID\":\"8400\",\"KOR_STEP_GROUP_NAME\":\"포장\",\"ENG_STEP_GROUP_NAME\":\"Packing\",\"RACK_STEP_COUNT\":\"768\",\"TOTAL\":\"810\",\"STEP_CAPACITY\":\"94.81\",\"TIMESTAMP\":\"2025-03-25T12:00:01.000Z\"},{\"STOCKER_NAME\":\"HFF09AGM0100\",\"STEP_ID\":\"8245\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"38\",\"TOTAL\":\"810\",\"STEP_CAPACITY\":\"4.69\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGM0100\",\"STEP_ID\":\"8106\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"38\",\"TOTAL\":\"810\",\"STEP_CAPACITY\":\"4.69\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGM0100\",\"STEP_ID\":\"8010\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"38\",\"TOTAL\":\"810\",\"STEP_CAPACITY\":\"4.69\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGM0100\",\"STEP_ID\":\"8182\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"38\",\"TOTAL\":\"810\",\"STEP_CAPACITY\":\"4.69\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGM0100\",\"STEP_ID\":\"8220\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"38\",\"TOTAL\":\"810\",\"STEP_CAPACITY\":\"4.69\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGM0100\",\"STEP_ID\":\"8014\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"38\",\"TOTAL\":\"810\",\"STEP_CAPACITY\":\"4.69\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGM0100\",\"STEP_ID\":\"8108\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"38\",\"TOTAL\":\"810\",\"STEP_CAPACITY\":\"4.69\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGM0100\",\"STEP_ID\":\"8250\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"38\",\"TOTAL\":\"810\",\"STEP_CAPACITY\":\"4.69\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGM0100\",\"STEP_ID\":\"8016\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"38\",\"TOTAL\":\"810\",\"STEP_CAPACITY\":\"4.69\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGM0100\",\"STEP_ID\":\"8047\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"38\",\"TOTAL\":\"810\",\"STEP_CAPACITY\":\"4.69\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGM0100\",\"STEP_ID\":null,\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"37\",\"TOTAL\":\"810\",\"STEP_CAPACITY\":\"4.57\",\"TIMESTAMP\":\"2025-03-25T12:00:01.000Z\"}]},{\"STOCKER_NAME\":\"HFF09AGH0100\",\"CAPACITY\":\"89.9\",\"MAXIMUM_CAPACITY\":\"406\",\"TRAY_CAPACITY\":\"88.59\",\"MAXIMUM_TRAY_CAPACITY\":\"1218\",\"RACK_LOAD_COUNT\":\"365\",\"RACK_EMPTY_COUNT\":\"41\",\"RESERVATED_RETURN_COUNT\":\"7\",\"TRAY_COUNT\":\"1079\",\"TRAY_REWORK_COUNT_AVG\":\"6\",\"TRAY_REWORK_COUNT_MAX\":\"64\",\"TRAY_REWORK_COUNT_MIN\":\"0\",\"RACK_DISABLE_COUNT\":\"0\",\"KOR_EQP_NAME\":\"고온Aging #01\",\"ENG_EQP_NAME\":\"고온Aging #01\",\"TIMESTAMP\":\"2025-03-25T12:00:00.000Z\",\"STEP\":[{\"STOCKER_NAME\":\"HFF09AGH0100\",\"STEP_ID\":\"8190\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"39\",\"TOTAL\":\"406\",\"STEP_CAPACITY\":\"9.61\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGH0100\",\"STEP_ID\":\"8040\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"39\",\"TOTAL\":\"406\",\"STEP_CAPACITY\":\"9.61\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGH0100\",\"STEP_ID\":\"8016\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"39\",\"TOTAL\":\"406\",\"STEP_CAPACITY\":\"9.61\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGH0100\",\"STEP_ID\":\"8020\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"39\",\"TOTAL\":\"406\",\"STEP_CAPACITY\":\"9.61\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGH0100\",\"STEP_ID\":\"8150\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"39\",\"TOTAL\":\"406\",\"STEP_CAPACITY\":\"9.61\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGH0100\",\"STEP_ID\":\"8024\",\"KOR_STEP_GROUP_NAME\":\"고온 Aging3\",\"ENG_STEP_GROUP_NAME\":\"High Temp Aging3\",\"RACK_STEP_COUNT\":\"251\",\"TOTAL\":\"406\",\"STEP_CAPACITY\":\"61.82\",\"TIMESTAMP\":\"2025-03-25T12:00:01.000Z\"},{\"STOCKER_NAME\":\"HFF09AGH0100\",\"STEP_ID\":\"8028\",\"KOR_STEP_GROUP_NAME\":\"고온 Aging5\",\"ENG_STEP_GROUP_NAME\":\"High Temp Aging5\",\"RACK_STEP_COUNT\":\"1\",\"TOTAL\":\"406\",\"STEP_CAPACITY\":\"0.25\",\"TIMESTAMP\":\"2025-03-25T12:00:01.000Z\"},{\"STOCKER_NAME\":\"HFF09AGH0100\",\"STEP_ID\":\"0\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"113\",\"TOTAL\":\"406\",\"STEP_CAPACITY\":\"27.83\",\"TIMESTAMP\":\"2025-03-25T12:00:01.000Z\"},{\"STOCKER_NAME\":\"HFF09AGH0100\",\"STEP_ID\":\"8025\",\"KOR_STEP_GROUP_NAME\":\"냉각 Aging3\",\"ENG_STEP_GROUP_NAME\":\"Cold Temp Aging3\",\"RACK_STEP_COUNT\":\"1\",\"TOTAL\":\"406\",\"STEP_CAPACITY\":\"0.25\",\"TIMESTAMP\":\"2025-03-25T11:23:53.000Z\"},{\"STOCKER_NAME\":\"HFF09AGH0100\",\"STEP_ID\":\"8022\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"39\",\"TOTAL\":\"406\",\"STEP_CAPACITY\":\"9.61\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGH0100\",\"STEP_ID\":\"8026\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"39\",\"TOTAL\":\"406\",\"STEP_CAPACITY\":\"9.61\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGH0100\",\"STEP_ID\":\"8029\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"39\",\"TOTAL\":\"406\",\"STEP_CAPACITY\":\"9.61\",\"TIMESTAMP\":\"2025-03-25T08:24:51.000Z\"},{\"STOCKER_NAME\":\"HFF09AGH0100\",\"STEP_ID\":null,\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"41\",\"TOTAL\":\"406\",\"STEP_CAPACITY\":\"10.1\",\"TIMESTAMP\":\"2025-03-25T12:00:01.000Z\"}]}],\r\n \"CARRIER\":[{\"MAIN_CARR_ID\":\"2F02365\",\"SUB_CARR_ID\":\"2F02365,2F70671,2F28723\",\"CARR_SEQ\":\"3\",\"CARR_USE\":\"EMPTY\",\"CURRENTPORT\":\"HFF09CNV0300_ABP3003\",\"CURRENTRACK\":null,\"MOVE_JOBID\":null,\"MOVESTATUS\":\"ARRIVED\",\"FINALTOOLID\":null,\"MOVEFLAG\":\"0\",\"PROD_ID\":null,\"FTY_NO\":null,\"WORK_TYPE\":null,\"MFG_TYPE\":null,\"PROD_DETAIL_CODE\":\"E3A\",\"STEP_ID\":null,\"NEXT_STEP_ID\":null,\"ASSIGN_LOT_QTY\":\"0\",\"FRMT_BATCH_ID\":null,\"CARR_SIZE_TYPE\":\"STACK3\",\"ABNM_VALUE\":\"0\",\"LINE_ID\":\"FM0I\",\"TIMESTAMP\":\"2025-03-25T11:59:57.000Z\",\"INPUT_QTY\":null,\"GOOD_QTY\":\"0\",\"BAD_QTY\":null,\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"NEXT_KOR_STEP_GROUP_NAME\":null,\"NEXT_ENG_STEP_GROUP_NAME\":null,\"LOT_ID\":null,\"CTH_REEL_ID\":null,\"ANODE_REEL_ID\":null,\"CARR_NO\":null,\"BATCH_GUBUN\":null,\"PROC_IN_TIME\":null,\"IN_CARR_QTY\":null,\"LAST_TKIN_TIME\":null,\"VHCL_ID\":null,\"FIRST_FRMT_INPUT_TIME\":null,\"CURRENTLOCATION\":\"HFF09CNV0300\",\"JOB_ID\":null,\"FROM_PORT\":null,\"TO_PORT\":null,\"TRANSPORT_JOB_TIMESTAMP\":null},{\"MAIN_CARR_ID\":\"2F52504\",\"SUB_CARR_ID\":\"2F52504,2F11450,2F51910\",\"CARR_SEQ\":\"3\",\"CARR_USE\":\"FULL\",\"CURRENTPORT\":\"HFF09CDS0200_UBP02\",\"CURRENTRACK\":null,\"MOVE_JOBID\":null,\"MOVESTATUS\":\"ARRIVED\",\"FINALTOOLID\":null,\"MOVEFLAG\":\"0\",\"PROD_ID\":\"CP7024F111A\",\"FTY_NO\":\"70B0\",\"WORK_TYPE\":\"NM\",\"MFG_TYPE\":\"PP02\",\"PROD_DETAIL_CODE\":\"E3A\",\"STEP_ID\":\"8024\",\"NEXT_STEP_ID\":\"8025\",\"ASSIGN_LOT_QTY\":\"288\",\"FRMT_BATCH_ID\":\"H1J70SA253HO22\",\"CARR_SIZE_TYPE\":\"STACK3\",\"ABNM_VALUE\":\"0\",\"LINE_ID\":\"FM0I\",\"TIMESTAMP\":\"2025-03-25T11:59:57.000Z\",\"INPUT_QTY\":\"288\",\"GOOD_QTY\":\"288\",\"BAD_QTY\":null,\"KOR_STEP_GROUP_NAME\":\"고온 Aging3\",\"ENG_STEP_GROUP_NAME\":\"High Temp Aging3\",\"NEXT_KOR_STEP_GROUP_NAME\":\"냉각 Aging3\",\"NEXT_ENG_STEP_GROUP_NAME\":\"Cold Temp Aging3\",\"LOT_ID\":\"36092532270707BKDS1B\",\"CTH_REEL_ID\":\"H16CP25310A118D\",\"ANODE_REEL_ID\":\"H16AP25321A113E\",\"CARR_NO\":\"H1J70SA251DC13-5524\",\"BATCH_GUBUN\":\"PP02\",\"PROC_IN_TIME\":\"2025-03-22T21:57:57.000Z\",\"IN_CARR_QTY\":\"288\",\"LAST_TKIN_TIME\":\"2025-03-25T09:46:35.000Z\",\"VHCL_ID\":null,\"FIRST_FRMT_INPUT_TIME\":\"2025-03-22T21:58:00.000Z\",\"CURRENTLOCATION\":\"HFF09CDS0200\",\"JOB_ID\":null,\"FROM_PORT\":null,\"TO_PORT\":null,\"TRANSPORT_JOB_TIMESTAMP\":\"2025-03-25T11:57:14.000Z\"},{\"MAIN_CARR_ID\":\"3F18182\",\"SUB_CARR_ID\":\"3F18182\",\"CARR_SEQ\":\"1\",\"CARR_USE\":\"FULL\",\"CURRENTPORT\":\"HFF11CNV0500_ABP4714\",\"CURRENTRACK\":null,\"MOVE_JOBID\":null,\"MOVESTATUS\":\"IN-EQP\",\"FINALTOOLID\":null,\"MOVEFLAG\":\"0\",\"PROD_ID\":\"CP7024F111A\",\"FTY_NO\":\"70B0\",\"WORK_TYPE\":\"NM\",\"MFG_TYPE\":\"PP02\",\"PROD_DETAIL_CODE\":\"E3A\",\"STEP_ID\":\"8108\",\"NEXT_STEP_ID\":\"8116\",\"ASSIGN_LOT_QTY\":\"96\",\"FRMT_BATCH_ID\":\"H1M70SB253GL21\",\"CARR_SIZE_TYPE\":\"STACK4\",\"ABNM_VALUE\":\"0\",\"LINE_ID\":\"FM0M\",\"TIMESTAMP\":\"2025-03-25T11:59:55.000Z\",\"INPUT_QTY\":\"96\",\"GOOD_QTY\":\"96\",\"BAD_QTY\":null,\"KOR_STEP_GROUP_NAME\":\"출하 IR/OCV\",\"ENG_STEP_GROUP_NAME\":\"G/I IR/OCV\",\"NEXT_KOR_STEP_GROUP_NAME\":\"IR/OCV4 불량선별\",\"NEXT_ENG_STEP_GROUP_NAME\":\"IR/OCV4 Defect Detect\",\"LOT_ID\":\"36112531922037BKDS1B\",\"CTH_REEL_ID\":\"H16CP25309A120B\",\"ANODE_REEL_ID\":\"H16AP25309A121D\",\"CARR_NO\":\"H1M70SA253GJ13-022\",\"BATCH_GUBUN\":\"PP02\",\"PROC_IN_TIME\":\"2025-03-19T16:38:53.000Z\",\"IN_CARR_QTY\":\"96\",\"LAST_TKIN_TIME\":\"2025-03-25T11:59:54.000Z\",\"VHCL_ID\":null,\"FIRST_FRMT_INPUT_TIME\":\"2025-03-19T16:38:55.000Z\",\"CURRENTLOCATION\":\"HFF11CNV0500\",\"JOB_ID\":null,\"FROM_PORT\":null,\"TO_PORT\":null,\"TRANSPORT_JOB_TIMESTAMP\":null}]\r\n}" + }; + + } +} diff --git a/Assets/Scripts/UVC/Tests/MockMQTTService.cs.meta b/Assets/Scripts/UVC/Tests/MockMQTTService.cs.meta new file mode 100644 index 00000000..6e2c7a02 --- /dev/null +++ b/Assets/Scripts/UVC/Tests/MockMQTTService.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: ed55ad7bcf744a34b9da619859525801 \ No newline at end of file diff --git a/Assets/Scripts/UVC/Tests/Tester.cs b/Assets/Scripts/UVC/Tests/Tester.cs index ce8ca029..ae8fe5e1 100644 --- a/Assets/Scripts/UVC/Tests/Tester.cs +++ b/Assets/Scripts/UVC/Tests/Tester.cs @@ -7,7 +7,8 @@ namespace UVC.Tests public static void RunAllTests() { //new DataMapperTests().TestAll(); - new HttpPipeLineTests().TestAll(); + //new HttpPipeLineTests().TestAll(); + new MQTTPipeLineTests().TestAll(); } } }