Files
EnglewoodLAB/Assets/Sample/Data/MockHttpRequester.cs

154 lines
82 KiB
C#
Raw Permalink Normal View History

2026-01-20 11:27:56 +09:00
#nullable enable
using Cysharp.Threading.Tasks;
using System.Collections.Generic;
using UVC.Json;
namespace UVC.Sample.Data
2026-01-20 11:27:56 +09:00
{
/// <summary>
/// HTTP 요청을 모의(mock)하기 위한 클래스로, 테스트 환경에서 실제 HTTP 요청 없이 미리 정의된 응답을 반환합니다.
/// </summary>
/// <remarks>
/// 이 클래스는 테스트 목적으로 HttpRequester 클래스의 동작을 시뮬레이션합니다.
/// URL에 따라 다양한 미리 정의된 응답을 반환하거나 SetResponse 메서드를 통해
/// 특정 URL에 대한 커스텀 응답을 설정할 수 있습니다.
/// </remarks>
public class MockHttpRequester
{
/// <summary>
/// URL별 응답 데이터를 저장하는 딕셔너리입니다.
/// </summary>
private static Dictionary<string, string> responseDic = new Dictionary<string, string>();
/// <summary>
/// 특정 URL에 대한 응답을 설정합니다.
/// </summary>
/// <param name="url">응답을 설정할 URL</param>
/// <param name="response">설정할 응답 문자열 (JSON 형식)</param>
/// <remarks>
/// 이미 설정된 URL에 대한 응답이 있다면 새 응답으로 업데이트됩니다.
/// </remarks>
public static void SetResponse(string url, string response)
{
if (!responseDic.ContainsKey(url))
{
responseDic[url] = response;
}
else
{
responseDic[url] = response; // Update existing response
}
}
/// <summary>
/// 저장된 응답 데이터를 초기화합니다.
/// </summary>
/// <param name="key">선택적으로 특정 URL에 대한 응답만 초기화하려면 URL을 지정합니다. null이면 모든 응답을 초기화합니다.</param>
public static void ClearResponses(string? key = null)
{
if (key != null && responseDic.ContainsKey(key))
{
responseDic.Remove(key);
return;
}
responseDic.Clear();
}
/// <summary>
/// HTTP 요청을 시뮬레이션하고 미리 정의된 응답을 반환합니다.
/// </summary>
/// <typeparam name="T">반환할 데이터 타입</typeparam>
/// <param name="url">요청 URL</param>
/// <param name="method">HTTP 메서드 (GET, POST 등)</param>
/// <param name="body">요청 본문 (선택적)</param>
/// <param name="header">요청 헤더 (선택적)</param>
/// <param name="useAuth">인증 사용 여부 (선택적)</param>
/// <returns>지정된 타입으로 변환된 응답</returns>
/// <remarks>
/// 이 메서드는 네트워크 지연을 시뮬레이션하기 위해 짧은 지연 시간 후에 응답을 반환합니다.
/// URL이 responseDic에 있으면 해당 사용자 정의 응답을 반환하고, 없으면 URL에 포함된 키워드에 따라
/// 미리 정의된 응답을 반환합니다.
/// </remarks>
public static async UniTask<T> Request<T>(string url, string method, string? body = null, Dictionary<string, string>? header = null, bool useAuth = false)
{
await UniTask.Delay(100);// new Random().Next(100, 1000)); // Simulate network delay
if (responseDic.TryGetValue(url, out string response))
{
response = responseDic[url];
}
else
{
response = "{\"message\":\"Success\", \"data\":" + GetResponse(url) + "}";
}
if (typeof(T) == typeof(string))
{
return (T)(object)response;
}
else
{
return JsonHelper.FromJson<T>(response);
}
}
/// <summary>
/// URL 키워드에 따라 미리 정의된 응답을 반환합니다.
/// </summary>
/// <param name="url">응답을 결정할 URL</param>
/// <returns>URL 키워드에 맞는 미리 정의된 JSON 응답</returns>
/// <remarks>
/// URL에 특정 키워드(예: "agv", "alarm" 등)가 포함되어 있으면 그에 맞는
/// 테스트 데이터를 반환합니다. 일치하는 키워드가 없으면 기본 응답을 반환합니다.
/// </remarks>
private static string GetResponse(string url)
{
if (url.ToLower().Contains("agv"))
{
return responseAGV;
}
else if (url.ToLower().Contains("stoker_stack"))
{
return responseStokerStack;
}
else if (url.ToLower().Contains("stoker_crane"))
{
return responseStokerCrane;
}
else if (url.ToLower().Contains("carrier"))
{
return responseCarrier;
}
else if (url.ToLower().Contains("equipment"))
{
return responseEquipment;
}
else if (url.ToLower().Contains("alarm"))
{
return responseAlarm;
}
else if (url.ToLower().Contains("simulation_rank"))
{
return responseSimulationRank;
}
else if (url.ToLower().Contains("baseinfo"))
{
return responseBaseInfo;
}
else
{
return "{\"status\":\"unknown\"}";
}
}
private static string responseAGV = "[{\"VHL_NAME\":\"HFF09CNA8001\",\"AGV_IDX\":\"0\",\"B_INSTALL\":\"N\",\"NODE_ID\":\"0\",\"REAL_ID\":\"0\",\"VHL_STATE\":\"0\",\"BAY_LIST\":\"1;\",\"X\":\"0\",\"Y\":\"0\",\"MODE\":\"0\",\"BATT\":\"0\",\"SUB_GOAL\":\"0\",\"FINAL_GOAL\":\"0\",\"TIMESTAMP\":\"2025-03-08T15:34:27Z\",\"DEGREE\":\"0\",\"STOP_STATE\":\"0\",\"CMD_ID\":null,\"RESERVED_CMD\":null,\"ASSIGN_TIME\":null,\"TRANSFER_STATE\":null,\"SOURCE_REAL_ID\":null,\"DEST_REAL_ID\":null,\"CARRIER_LOCATION\":null,\"SOURCE_PORT\":null,\"DESTINATION_PORT\":null,\"RECEIVE_TIME\":null,\"CARRIER_ID\":null,\"BATCH_ID\":null,\"LOT_ID\":null,\"CARRIER_TIMESTAMP\":null,\"JOB_ID\":null,\"FROM\":\"NULL,NULL,NULL\",\"TO\":\"NULL,NULL,NULL\",\"TRANSPORT_JOB_TIMESTAMP\":\"2025-03-08T15:34:27Z\"},{\"VHL_NAME\":\"HFF09CNA8002\",\"AGV_IDX\":\"1\",\"B_INSTALL\":\"Y\",\"NODE_ID\":\"231\",\"REAL_ID\":\"231\",\"VHL_STATE\":\"11\",\"BAY_LIST\":\"7;\",\"X\":\"154136\",\"Y\":\"20166\",\"MODE\":\"1\",\"BATT\":\"38\",\"SUB_GOAL\":\"388\",\"FINAL_GOAL\":\"248\",\"TIMESTAMP\":\"2025-03-25T12:00:49.571Z\",\"DEGREE\":\"179.2\",\"STOP_STATE\":\"0\",\"CMD_ID\":\"2F35556_235_7061032854410412\",\"RESERVED_CMD\":null,\"ASSIGN_TIME\":\"2025-03-25T11:58:03Z\",\"TRANSFER_STATE\":\"2\",\"SOURCE_REAL_ID\":\"-1\",\"DEST_REAL_ID\":\"248\",\"CARRIER_LOCATION\":\"HFF09CNA8002_010101\",\"SOURCE_PORT\":\"HFF09AGN0400_UOP01\",\"DESTINATION_PORT\":\"HFF09INA0300_LIP01\",\"RECEIVE_TIME\":\"2025-03-25T11:58:03Z\",\"CARRIER_ID\":\"2F35556,2F35323,2F11113\",\"BATCH_ID\":null,\"LOT_ID\":null,\"CARRIER_TIMESTAMP\":\"2025-03-25T11:59:47Z\",\"JOB_ID\":\"2F35556_235_7061032854410412\",\"FROM\":\"HFF09AGN0400,HFF09AGN0400_UOP08,NULL\",\"TO\":\"HFF09INA0300,HFF09INA0300_LIP01,NULL\",\"TRANSPORT_JOB_TIMESTAMP\":\"2025-03-25T11:59:36Z\"},{\"VHL_NAME\":\"HFF09CNA8003\",\"AGV_IDX\":\"2\",\"B_INSTALL\":\"N\",\"NODE_ID\":\"0\",\"REAL_ID\":\"0\",\"VHL_STATE\":\"0\",\"BAY_LIST\":\"3;4;\",\"X\":\"0\",\"Y\":\"0\",\"MODE\":\"0\",\"BATT\":\"0\",\"SUB_GOAL\":\"0\",\"FINAL_GOAL\":\"0\",\"TIMESTAMP\":\"2025-03-25T12:00:50Z\",\"DEGREE\":\"0\",\"STOP_STATE\":\"0\",\"CMD_ID\":null,\"RESERVED_CMD\":null,\"ASSIGN_TIME\":null,\"TRANSFER_STATE\":null,\"SOURCE_REAL_ID\":null,\"DEST_REAL_ID\":null,\"CARRIER_LOCATION\":null,\"SOURCE_PORT\":null,\"DESTINATION_PORT\":null,\"RECEIVE_TIME\":null,\"CARRIER_ID\":null,\"BATCH_ID\":null,\"LOT_ID\":null,\"CARRIER_TIMESTAMP\":null,\"JOB_ID\":null,\"FROM\":\"NULL,NULL,NULL\",\"TO\":\"NULL,NULL,NULL\",\"TRANSPORT_JOB_TIMESTAMP\":\"2025-03-25T12:00:50Z\"}]";
private static string responseStokerStack = "[{\"STOCKER_NAME\":\"HFF09AGC0100\",\"CAPACITY\":\"80.12\",\"MAXIMUM_CAPACITY\":\"166\",\"TRAY_CAPACITY\":\"79.72\",\"MAXIMUM_TRAY_CAPACITY\":\"498\",\"RACK_LOAD_COUNT\":\"133\",\"RACK_EMPTY_COUNT\":\"33\",\"RESERVATED_RETURN_COUNT\":\"0\",\"TRAY_COUNT\":\"397\",\"TRAY_REWORK_COUNT_AVG\":\"2\",\"TRAY_REWORK_COUNT_MAX\":\"17\",\"TRAY_REWORK_COUNT_MIN\":\"0\",\"RACK_DISABLE_COUNT\":\"0\",\"KOR_EQP_NAME\":\"H09L_냉각Aging_E01\",\"ENG_EQP_NAME\":\"H09L_CTAging_E01\",\"TIMESTAMP\":\"2025-03-25T12:00:51Z\",\"STEP\":[{\"STOCKER_NAME\":\"HFF09AGC0100\",\"STEP_ID\":\"8016\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"33\",\"TOTAL\":\"166\",\"STEP_CAPACITY\":\"19.88\",\"TIMESTAMP\":\"2025-03-25T13:00:51\"},{\"STOCKER_NAME\":\"HFF09AGC0100\",\"STEP_ID\":\"8025\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"33\",\"TOTAL\":\"166\",\"STEP_CAPACITY\":\"19.88\",\"TIMESTAMP\":\"2025-03-25T13:00:51\"},{\"STOCKER_NAME\":\"HFF09AGC0100\",\"STEP_ID\":\"8029\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"33\",\"TOTAL\":\"166\",\"STEP_CAPACITY\":\"19.88\",\"TIMESTAMP\":\"2025-03-25T13:00:51\"},{\"STOCKER_NAME\":\"HFF09AGC0100\",\"STEP_ID\":\"8027\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"33\",\"TOTAL\":\"166\",\"STEP_CAPACITY\":\"19.88\",\"TIMESTAMP\":\"2025-03-25T13:00:51\"},{\"STOCKER_NAME\":\"HFF09AGC0100\",\"STEP_ID\":\"8042\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"33\",\"TOTAL\":\"166\",\"STEP_CAPACITY\":\"19.88\",\"TIMESTAMP\":\"2025-03-25T13:00:51\"},{\"STOCKER_NAME\":\"HFF09AGC0100\",\"STEP_ID\":\"0\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"33\",\"TOTAL\":\"166\",\"STEP_CAPACITY\":\"19.88\",\"TIMESTAMP\":\"2025-03-25T13:00:51\"},{\"STOCKER_NAME\":\"HFF09AGC0100\",\"STEP_ID\":\"8014\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"33\",\"TOTAL\":\"166\",\"STEP_CAPACITY\":\"19.88\",\"TIMESTAMP\":\"2025-03-25T13:00:51\"}]},{\"STOCKER_NAME\":\"HFF09AGH0100\",\"CAPACITY\":\"89.66\",\"MAXIMUM_CAPACITY\":\"406\",\"TRAY_CAPACITY\":\"88.34\",\"MAXIMUM_TRAY_CAPACITY\":\"1218\",\"RACK_LOAD_COUNT\":\"364\",\"RACK_EMPTY_COUNT\":\"42\",\"RESERVATED_RETURN_COUNT\":\"6\",\"TRAY_COUNT\":\"1076\",\"TRAY_REWORK_COUNT_AVG\":\"6\",\"TRAY_REWORK_COUNT_MAX\":\"64\",\"TRAY_REWORK_COUNT_MIN\":\"0\",\"RACK_DISABLE_COUNT\":\"0\",\"KOR_EQP_NAME\":\"H09L_고온Aging_E01\",\"ENG_EQP_NAME\":\"H09L_HTAging_E01\",\"TIMESTAMP\":\"2025-03-25T12:00:51Z\",\"STEP\":[{\"STOCKER_NAME\":\"HFF09AGH0100\",\"STEP_ID\":\"8190\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"42\",\"TOTAL\":\"406\",\"STEP_CAPACITY\":\"10.34\",\"TIMESTAMP\":\"2025-03-25T13:00:51\"},{\"STOCKER_NAME\":\"HFF09AGH0100\",\"STEP_ID\":\"8040\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"42\",\"TOTAL\":\"406\",\"STEP_CAPACITY\":\"10.34\",\"TIMESTAMP\":\"2025-03-25T13:00:51\"},{\"STOCKER_NAME\":\"HFF09AGH0100\",\"STEP_ID\":\"8016\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"42\",\"TOTAL\":\"406\",\"STEP_CAPACITY\":\"10.34\",\"TIMESTAMP\":\"2025-03-25T13:00:51\"},{\"STOCKER_NAME\":\"HFF09AGH0100\",\"STEP_ID\":\"8020\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"42\",\"TOTAL\":\"406\",\"STEP_CAPACITY\":\"10.34\",\"TIMESTAMP\":\"2025-03-25T13:00:51\"},{\"STOCKER_NAME\":\"HFF09AGH0100\",\"STEP_ID\":\"8150\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"42\",\"TOTAL\":\"406\",\"STEP_CAPACITY\":\"10.34\",\"TIMESTAMP\":\"2025-03-25T13:00:51\"},{\"STOCKER_NAME\":\"HFF09AGH0100\",\"STEP_ID\":\"8024\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"42\",\"TOTAL\":\"406\",\"STEP_CAPACITY\":\"10.34\",\"TIMESTAMP\":\"2025-03-25T13:00:51\"},{\"STOCKER_NAME\":\"HFF09AGH0100\",\"STEP_ID\":\"8028\",\"KOR_STEP_G
private static string responseStokerCrane = "[{\"STOCKER_NAME\":\"HFF09AGN0101\",\"TIMESTAMP\":\"2025-03-25T12:00:29.92Z\",\"BANK\":\"0\",\"BAY\":\"37\",\"LEVEL\":\"11\",\"REALTIME_FACTOR\":\"57.59\",\"KOR_EQP_NAME\":\"상온Aging #01 S/C\",\"ENG_EQP_NAME\":\"NTAging #01 S/C\",\"HP_CARRIER\":\"2F21582\",\"HP_JOB_ID\":\"2F21582_589_7060449316279234\",\"HP_FROM\":\"HFF09CNV0500,HFF09CNV0500_UOP11,NULL\",\"HP_TO\":\"HFF09AGN0100,NULL,NULL\",\"OP_CARRIER\":null,\"OP_JOB_ID\":null,\"OP_FROM\":null,\"OP_TO\":null},{\"STOCKER_NAME\":\"HFF09CDS0201\",\"TIMESTAMP\":\"2025-03-25T12:00:50.162Z\",\"BANK\":\"0\",\"BAY\":\"12\",\"LEVEL\":\"3\",\"REALTIME_FACTOR\":\"79.7\",\"KOR_EQP_NAME\":\"충방전 Room #02 S/C\",\"ENG_EQP_NAME\":\"Charger Room #02 S/C\",\"HP_CARRIER\":\"2F24482\",\"HP_JOB_ID\":\"2F24482_156_7061057791208036\",\"HP_FROM\":\"HFF09CDS0200,NULL,0400505\",\"HP_TO\":\"HFF09CDS0200,HFF09CDS0200_UBP12,NULL\",\"OP_CARRIER\":\"2F51056\",\"OP_JOB_ID\":\"2F51056_263_7060924349168559\",\"OP_FROM\":\"HFF09CDS0200,NULL,0400404\",\"OP_TO\":\"HFF09CDS0200,HFF09CDS0200_UBP12,NULL\"},{\"STOCKER_NAME\":\"HFF11AGN0401\",\"TIMESTAMP\":\"2025-03-24T17:33:59.819Z\",\"BANK\":\"0\",\"BAY\":\"0\",\"LEVEL\":\"1\",\"REALTIME_FACTOR\":\"0\",\"KOR_EQP_NAME\":\"상온Aging #04 S/C\",\"ENG_EQP_NAME\":\"Norm. Temp.AG Stocker #04 S/C\",\"HP_CARRIER\":\"3F\",\"HP_JOB_ID\":null,\"HP_FROM\":null,\"HP_TO\":null,\"OP_CARRIER\":null,\"OP_JOB_ID\":null,\"OP_FROM\":null,\"OP_TO\":null}]";
private static string responseCarrier = "[{\"MAIN_CARR_ID\":\"225263\",\"SUB_CARR_ID\":\"225263\",\"CARR_SEQ\":\"1\",\"CARR_USE\":\"EMPTY\",\"CURRENTLOCATION\":\"HFB11ECS1300\",\"CURRENTPORT\":\"HFB11ECS1300_LIP01\",\"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\":\"2024-12-10T13:14:05Z\",\"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,\"PRGS_STS\":null,\"JOB_ID\":null,\"FROM_PORT\":\"NULL,NULL,NULL\",\"TO_PORT\":\"NULL,NULL,NULL\",\"TRANSPORT_JOB_TIMESTAMP\":null},{\"MAIN_CARR_ID\":\"2F\",\"SUB_CARR_ID\":\"2F\",\"CARR_SEQ\":\"1\",\"CARR_USE\":\"EMPTY\",\"CURRENTLOCATION\":null,\"CURRENTPORT\":null,\"CURRENTRACK\":null,\"MOVE_JOBID\":null,\"MOVESTATUS\":\"ARRIVED\",\"FINALTOOLID\":\"HFF09AGN0300_ZONE01\",\"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-24T15:40:22Z\",\"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,\"PRGS_STS\":null,\"JOB_ID\":\"2F_470_6987558774994436\",\"FROM_PORT\":\"HFF09CNV0500,HFF09CNV0500_UOP12,NULL\",\"TO_PORT\":\"HFF09AGN0300,NULL,NULL\",\"TRANSPORT_JOB_TIMESTAMP\":\"2025-03-24T15:39:52Z\"},{\"MAIN_CARR_ID\":\"2F U{9\",\"SUB_CARR_ID\":\"2F U{9\",\"CARR_SEQ\":\"1\",\"CARR_USE\":\"EMPTY\",\"CURRENTLOCATION\":\"HFB09ICS0500\",\"CURRENTPORT\":\"HFB09ICS0500_LIP01\",\"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-02-02T11:48:55Z\",\"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,\"PRGS_STS\":null,\"JOB_ID\":null,\"FROM_PORT\":\"NULL,NULL,NULL\",\"TO_PORT\":\"NULL,NULL,NULL\",\"TRANSPORT_JOB_TIMESTAMP\":null},{\"MAIN_CARR_ID\":\"2F00001\",\"SUB_CARR_ID\":\"2F00001,2F23054,2F02234\",\"CARR_SEQ\":\"3\",\"CARR_USE\":\"FULL\",\"CURRENTLOCATION\":\"HFF09AGN0100_0200210\",\"CURRENTPORT\":null,\"CURRENTRACK\":\"0200210\",\"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\":\"8016\",\"NEXT_STEP_ID\":\"8106\",\"ASSIGN_LOT_QTY\":\"288\",\"FRMT_BATCH_ID\":\"H1J70SA253GK21\",\"CARR_SIZE_TYPE\":\"STACK3\",\"ABNM_VALUE\":\"0\",\"LINE_ID\":\"FM0I\",\"TIMESTAMP\":\"2025-03-24T15:51:07Z\",\"INPUT_QTY\":\"288\",\"GOOD_QTY\":\"2
private static string responseEquipment = "[{\"LINE_ID\":\"FM0I\",\"KOR_LINE_NAME\":\"헝가리 화성 #09-1\",\"ENG_LINE_NAME\":\"HT #09-1\",\"EQP_ID\":\"HFF09CDC0100\",\"KOR_EQP_NAME\":\"충방전기 #01\",\"ENG_EQP_NAME\":\"Charger #01\",\"UP_DOWN_STS\":null,\"AUTO_MODE_STS\":null,\"STATE_ID\":\"IDLE\",\"NTW_STS\":\"CONNECT\",\"RECIPE_ID\":null,\"WO_ID\":null,\"EQP_TYPE\":\"CD\",\"TIMESTAMP\":\"2025-01-31T20:18:01Z\",\"OLD_KOR_EQP_NAME\":\"H09L_충방전기_L01_01(PC01)\",\"OLD_ENG_EQP_NAME\":\"H09L_Charger_L01_01(PC01)\"},{\"LINE_ID\":\"BX0I\",\"KOR_LINE_NAME\":\"헝가리 포장 #09-1\",\"ENG_LINE_NAME\":\"HB #09-1\",\"EQP_ID\":\"HFB09ICS0100\",\"KOR_EQP_NAME\":\"특성검사 #01\",\"ENG_EQP_NAME\":\"INSPECTION #01\",\"UP_DOWN_STS\":null,\"AUTO_MODE_STS\":null,\"STATE_ID\":\"IDLE\",\"NTW_STS\":\"CONNECT\",\"RECIPE_ID\":null,\"WO_ID\":null,\"EQP_TYPE\":\"N/A\",\"TIMESTAMP\":\"2025-02-08T14:04:45Z\",\"OLD_KOR_EQP_NAME\":\"H09L_특성검사_ECS_E01\",\"OLD_ENG_EQP_NAME\":\"H09L_INSPECTION_INLINE_ECS_E01\"},{\"LINE_ID\":\"FM0I\",\"KOR_LINE_NAME\":\"헝가리 화성 #09-1\",\"ENG_LINE_NAME\":\"HT #09-1\",\"EQP_ID\":\"HFF09HVI0100\",\"KOR_EQP_NAME\":\"HV #01\",\"ENG_EQP_NAME\":\"HV #01\",\"UP_DOWN_STS\":null,\"AUTO_MODE_STS\":\"AUTO\",\"STATE_ID\":\"DOWN\",\"NTW_STS\":\"CONNECT\",\"RECIPE_ID\":\"H1IBBBX22052301M\",\"WO_ID\":\"H1IBBBX22052301M\",\"EQP_TYPE\":null,\"TIMESTAMP\":\"2025-03-13T00:07:56Z\",\"OLD_KOR_EQP_NAME\":\"H09L_HV_E01_#01\",\"OLD_ENG_EQP_NAME\":\"H09L_HV_E01_#01\"}]";
private static string responseAlarm = "[{\"ID\":\"1c7dd047-6f7d-4551-869c-bbe4fee6d4fe\",\"ALARM_TYPE\":\"logistics\",\"LEVEL\":\"HEAVY\",\"LOGISTIC\":\"1\",\"STATE\":\"SET\",\"MESSAGE\":\"Load PIO T1 Timeout (60s)\",\"CODE\":\"VHL_ALARM\",\"ICON\":\"AGV\",\"SET_TIME\":\"2025-03-25T12:00:50Z\",\"CLEAR_TIME\":null,\"TIMESTAMP\":\"2025-03-25T12:00:50Z\",\"MACHINENAME\":null,\"UNITNAME\":null,\"JOB_ID\":null,\"MAIN_CARR_ID\":null,\"FROM_EQP_ID\":null,\"FROM_UNIT_ID\":null,\"TO_EQP_ID\":null,\"TO_PORT_ID\":null,\"SHOPNAME\":\"S100\",\"UPDATE_TIME\":\"2025-03-25T12:00:50Z\",\"TRANSPORT_EQP_NAME\":null,\"TRANSPORT_UNIT_NAME\":null,\"FROM_EQP_NAME\":null,\"FROM_UNIT_NAME\":null,\"TO_EQP_NAME\":null,\"TO_UNIT_NAME\":null,\"TRANSPORT_EQP_ID\":\"HEA04ACS0100\",\"TRANSPORT_UNIT_ID\":\"HEC04RDA4069\",\"TO_UNIT_ID\":null,\"CONTINUE_TIME\":null,\"REFERENCE_ID\":\"73374eaf-2aae-4d83-9932-6104d25a758f\"},{\"ID\":\"7730f104-064e-40bc-8a3c-0cfd5471c59e\",\"ALARM_TYPE\":\"event\",\"LEVEL\":\"HEAVY\",\"LOGISTIC\":\"1\",\"STATE\":\"SET\",\"MESSAGE\":\"HFF11CDS0100_LBP05 Production Supply Logistics Delay\",\"CODE\":\"PROD_LOSS_IN\",\"ICON\":\"TR\",\"SET_TIME\":\"2025-03-25T12:00:48.699Z\",\"CLEAR_TIME\":null,\"TIMESTAMP\":\"2025-03-25T12:00:48.699Z\",\"MACHINENAME\":null,\"UNITNAME\":null,\"JOB_ID\":null,\"MAIN_CARR_ID\":null,\"FROM_EQP_ID\":null,\"FROM_UNIT_ID\":null,\"TO_EQP_ID\":null,\"TO_PORT_ID\":null,\"SHOPNAME\":\"S300\",\"UPDATE_TIME\":\"2025-03-25T12:00:48.699Z\",\"TRANSPORT_EQP_NAME\":\"충방전 Room #01\",\"TRANSPORT_UNIT_NAME\":\"충방전 AG #1호기 입고대 Track #1-4\",\"FROM_EQP_NAME\":null,\"FROM_UNIT_NAME\":null,\"TO_EQP_NAME\":null,\"TO_UNIT_NAME\":null,\"TRANSPORT_EQP_ID\":\"HFF11CDS0100\",\"TRANSPORT_UNIT_ID\":\"HFF11CDS0100_LBP05\",\"TO_UNIT_ID\":null,\"CONTINUE_TIME\":null,\"REFERENCE_ID\":null},{\"ID\":\"b20b107b-bdea-4b41-be6e-7f147b8fb6fa\",\"ALARM_TYPE\":\"event\",\"LEVEL\":\"HEAVY\",\"LOGISTIC\":\"1\",\"STATE\":\"SET\",\"MESSAGE\":\"HFF11CDS0100_LBP04 Production Supply Logistics Delay\",\"CODE\":\"PROD_LOSS_IN\",\"ICON\":\"TR\",\"SET_TIME\":\"2025-03-25T12:00:44.686Z\",\"CLEAR_TIME\":null,\"TIMESTAMP\":\"2025-03-25T12:00:44.686Z\",\"MACHINENAME\":null,\"UNITNAME\":null,\"JOB_ID\":null,\"MAIN_CARR_ID\":null,\"FROM_EQP_ID\":null,\"FROM_UNIT_ID\":null,\"TO_EQP_ID\":null,\"TO_PORT_ID\":null,\"SHOPNAME\":\"S300\",\"UPDATE_TIME\":\"2025-03-25T12:00:44.686Z\",\"TRANSPORT_EQP_NAME\":\"충방전 Room #01\",\"TRANSPORT_UNIT_NAME\":\"충방전 AG #1호기 입고대 Track #1-3(Unstack Position Down)\",\"FROM_EQP_NAME\":null,\"FROM_UNIT_NAME\":null,\"TO_EQP_NAME\":null,\"TO_UNIT_NAME\":null,\"TRANSPORT_EQP_ID\":\"HFF11CDS0100\",\"TRANSPORT_UNIT_ID\":\"HFF11CDS0100_LBP04\",\"TO_UNIT_ID\":null,\"CONTINUE_TIME\":null,\"REFERENCE_ID\":null}]";
private static string responseSimulationRank = "[{\"type\":\"warehouseUtilization\",\"values\":[{\"timePivotName\":\"10분 뒤\",\"timePivotValue\":10,\"timePivotUnit\":\"minute\",\"pivotValues\":[{\"targetName\":\"#11,12 상온에이징 3호기\",\"targetCode\":\"HFF11AGN0300\",\"pivot\":99,\"pivotUnit\":\"percent\",\"maxPivot\":1000,\"predictValue\":99.52,\"predictValueUnit\":\"percent\",\"resultValue\":99.52,\"resultValueUnit\":\"percent\"},{\"targetName\":\"#11,12 상온에이징 4호기\",\"targetCode\":\"HFF11AGN0400\",\"pivot\":99,\"pivotUnit\":\"percent\",\"maxPivot\":1000,\"predictValue\":98.652,\"predictValueUnit\":\"percent\",\"resultValue\":98.652,\"resultValueUnit\":\"percent\"},{\"targetName\":\"#9,10 HVC 1호기\",\"targetCode\":\"HFF09PCH0100\",\"pivot\":99,\"pivotUnit\":\"percent\",\"maxPivot\":1000,\"predictValue\":93.93,\"predictValueUnit\":\"percent\",\"resultValue\":93.93,\"resultValueUnit\":\"percent\"}]},{\"timePivotName\":\"30분 뒤\",\"timePivotValue\":30,\"timePivotUnit\":\"minute\",\"pivotValues\":[{\"targetName\":\"#11,12 상온에이징 3호기\",\"targetCode\":\"HFF11AGN0300\",\"pivot\":99,\"pivotUnit\":\"percent\",\"maxPivot\":1000,\"predictValue\":99.52,\"predictValueUnit\":\"percent\",\"resultValue\":99.52,\"resultValueUnit\":\"percent\"},{\"targetName\":\"#11,12 상온에이징 4호기\",\"targetCode\":\"HFF11AGN0400\",\"pivot\":99,\"pivotUnit\":\"percent\",\"maxPivot\":1000,\"predictValue\":98.652,\"predictValueUnit\":\"percent\",\"resultValue\":98.652,\"resultValueUnit\":\"percent\"},{\"targetName\":\"#9,10 HVC 1호기\",\"targetCode\":\"HFF09PCH0100\",\"pivot\":99,\"pivotUnit\":\"percent\",\"maxPivot\":1000,\"predictValue\":94.82,\"predictValueUnit\":\"percent\",\"resultValue\":94.82,\"resultValueUnit\":\"percent\"}]},{\"timePivotName\":\"1시간 뒤\",\"timePivotValue\":1,\"timePivotUnit\":\"hour\",\"pivotValues\":[{\"targetName\":\"#11,12 상온에이징 3호기\",\"targetCode\":\"HFF11AGN0300\",\"pivot\":99,\"pivotUnit\":\"percent\",\"maxPivot\":1000,\"predictValue\":99.52,\"predictValueUnit\":\"percent\",\"resultValue\":99.52,\"resultValueUnit\":\"percent\"},{\"targetName\":\"#11,12 상온에이징 4호기\",\"targetCode\":\"HFF11AGN0400\",\"pivot\":99,\"pivotUnit\":\"percent\",\"maxPivot\":1000,\"predictValue\":98.652,\"predictValueUnit\":\"percent\",\"resultValue\":98.652,\"resultValueUnit\":\"percent\"},{\"targetName\":\"#11,12 고온에이징\",\"targetCode\":\"HFF11AGH0100\",\"pivot\":99,\"pivotUnit\":\"percent\",\"maxPivot\":1000,\"predictValue\":93.842,\"predictValueUnit\":\"percent\",\"resultValue\":93.842,\"resultValueUnit\":\"percent\"}]},{\"timePivotName\":\"2시간 뒤\",\"timePivotValue\":2,\"timePivotUnit\":\"hour\",\"pivotValues\":[{\"targetName\":\"#11,12 상온에이징 3호기\",\"targetCode\":\"HFF11AGN0300\",\"pivot\":99,\"pivotUnit\":\"percent\",\"maxPivot\":1000,\"predictValue\":99.64,\"predictValueUnit\":\"percent\",\"resultValue\":99.64,\"resultValueUnit\":\"percent\"},{\"targetName\":\"#11,12 상온에이징 4호기\",\"targetCode\":\"HFF11AGN0400\",\"pivot\":99,\"pivotUnit\":\"percent\",\"maxPivot\":1000,\"predictValue\":98.652,\"predictValueUnit\":\"percent\",\"resultValue\":98.652,\"resultValueUnit\":\"percent\"},{\"targetName\":\"#9,10 HVC 1호기\",\"targetCode\":\"HFF09PCH0100\",\"pivot\":99,\"pivotUnit\":\"percent\",\"maxPivot\":1000,\"predictValue\":96.32,\"predictValueUnit\":\"percent\",\"resultValue\":96.32,\"resultValueUnit\":\"percent\"}]}]},{\"type\":\"agvBottleneck\",\"values\":[{\"timePivotName\":\"10분 뒤\",\"timePivotValue\":10,\"timePivotUnit\":\"minute\",\"pivotValues\":[{\"targetName\":\"G층 후면\",\"targetCode\":\"GF_SOUTH\",\"pivot\":37.1,\"pivotUnit\":\"minute\",\"maxPivot\":1000,\"predictValue\":76.494,\"predictValueUnit\":\"minute\",\"resultValue\":76,\"resultValueUnit\":\"minute\"},{\"targetName\":\"G층 전면\",\"targetCode\":\"GF_NORTH\",\"pivot\":10,\"pivotUnit\":\"minute\",\"maxPivot\":1000,\"predictValue\":23.681,\"predictValueUnit\":\"minute\",\"resultValue\":23,\"resultValueUnit\":\"minute\"},{\"targetName\"
private static string responseBaseInfo = "{\"AGV\":[{\"VHL_NAME\":\"HFF09CNA8001\",\"AGV_IDX\":\"0\",\"B_INSTALL\":\"N\",\"NODE_ID\":\"0\",\"REAL_ID\":\"0\",\"VHL_STATE\":\"0\",\"BAY_LIST\":\"1;\",\"X\":\"0\",\"Y\":\"0\",\"MODE\":\"0\",\"BATT\":\"0\",\"SUB_GOAL\":\"0\",\"FINAL_GOAL\":\"0\",\"TIMESTAMP\":\"2025-03-08T15:34:27Z\",\"DEGREE\":\"0\",\"STOP_STATE\":\"0\",\"CMD_ID\":null,\"RESERVED_CMD\":null,\"ASSIGN_TIME\":null,\"TRANSFER_STATE\":null,\"SOURCE_REAL_ID\":null,\"DEST_REAL_ID\":null,\"CARRIER_LOCATION\":null,\"SOURCE_PORT\":null,\"DESTINATION_PORT\":null,\"RECEIVE_TIME\":null,\"CARRIER_ID\":null,\"BATCH_ID\":null,\"LOT_ID\":null,\"CARRIER_TIMESTAMP\":null,\"JOB_ID\":null,\"FROM\":\"NULL,NULL,NULL\",\"TO\":\"NULL,NULL,NULL\",\"TRANSPORT_JOB_TIMESTAMP\":\"2025-03-08T15:34:27Z\"},{\"VHL_NAME\":\"HFF09CNA8002\",\"AGV_IDX\":\"1\",\"B_INSTALL\":\"Y\",\"NODE_ID\":\"231\",\"REAL_ID\":\"231\",\"VHL_STATE\":\"11\",\"BAY_LIST\":\"7;\",\"X\":\"154136\",\"Y\":\"20166\",\"MODE\":\"1\",\"BATT\":\"38\",\"SUB_GOAL\":\"388\",\"FINAL_GOAL\":\"248\",\"TIMESTAMP\":\"2025-03-25T12:00:49.571Z\",\"DEGREE\":\"179.2\",\"STOP_STATE\":\"0\",\"CMD_ID\":\"2F35556_235_7061032854410412\",\"RESERVED_CMD\":null,\"ASSIGN_TIME\":\"2025-03-25T11:58:03Z\",\"TRANSFER_STATE\":\"2\",\"SOURCE_REAL_ID\":\"-1\",\"DEST_REAL_ID\":\"248\",\"CARRIER_LOCATION\":\"HFF09CNA8002_010101\",\"SOURCE_PORT\":\"HFF09AGN0400_UOP01\",\"DESTINATION_PORT\":\"HFF09INA0300_LIP01\",\"RECEIVE_TIME\":\"2025-03-25T11:58:03Z\",\"CARRIER_ID\":\"2F35556,2F35323,2F11113\",\"BATCH_ID\":null,\"LOT_ID\":null,\"CARRIER_TIMESTAMP\":\"2025-03-25T11:59:47Z\",\"JOB_ID\":\"2F35556_235_7061032854410412\",\"FROM\":\"HFF09AGN0400,HFF09AGN0400_UOP08,NULL\",\"TO\":\"HFF09INA0300,HFF09INA0300_LIP01,NULL\",\"TRANSPORT_JOB_TIMESTAMP\":\"2025-03-25T11:59:36Z\"},{\"VHL_NAME\":\"HFF09CNA8003\",\"AGV_IDX\":\"2\",\"B_INSTALL\":\"N\",\"NODE_ID\":\"0\",\"REAL_ID\":\"0\",\"VHL_STATE\":\"0\",\"BAY_LIST\":\"3;4;\",\"X\":\"0\",\"Y\":\"0\",\"MODE\":\"0\",\"BATT\":\"0\",\"SUB_GOAL\":\"0\",\"FINAL_GOAL\":\"0\",\"TIMESTAMP\":\"2025-03-25T12:00:50Z\",\"DEGREE\":\"0\",\"STOP_STATE\":\"0\",\"CMD_ID\":null,\"RESERVED_CMD\":null,\"ASSIGN_TIME\":null,\"TRANSFER_STATE\":null,\"SOURCE_REAL_ID\":null,\"DEST_REAL_ID\":null,\"CARRIER_LOCATION\":null,\"SOURCE_PORT\":null,\"DESTINATION_PORT\":null,\"RECEIVE_TIME\":null,\"CARRIER_ID\":null,\"BATCH_ID\":null,\"LOT_ID\":null,\"CARRIER_TIMESTAMP\":null,\"JOB_ID\":null,\"FROM\":\"NULL,NULL,NULL\",\"TO\":\"NULL,NULL,NULL\",\"TRANSPORT_JOB_TIMESTAMP\":\"2025-03-25T12:00:50Z\"}], \"STOCKER_STACK\":[{\"STOCKER_NAME\":\"HFF09AGC0100\",\"CAPACITY\":\"80.12\",\"MAXIMUM_CAPACITY\":\"166\",\"TRAY_CAPACITY\":\"79.72\",\"MAXIMUM_TRAY_CAPACITY\":\"498\",\"RACK_LOAD_COUNT\":\"133\",\"RACK_EMPTY_COUNT\":\"33\",\"RESERVATED_RETURN_COUNT\":\"0\",\"TRAY_COUNT\":\"397\",\"TRAY_REWORK_COUNT_AVG\":\"2\",\"TRAY_REWORK_COUNT_MAX\":\"17\",\"TRAY_REWORK_COUNT_MIN\":\"0\",\"RACK_DISABLE_COUNT\":\"0\",\"KOR_EQP_NAME\":\"H09L_냉각Aging_E01\",\"ENG_EQP_NAME\":\"H09L_CTAging_E01\",\"TIMESTAMP\":\"2025-03-25T12:00:51Z\",\"STEP\":[{\"STOCKER_NAME\":\"HFF09AGC0100\",\"STEP_ID\":\"8016\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"33\",\"TOTAL\":\"166\",\"STEP_CAPACITY\":\"19.88\",\"TIMESTAMP\":\"2025-03-25T13:00:51\"},{\"STOCKER_NAME\":\"HFF09AGC0100\",\"STEP_ID\":\"8025\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"33\",\"TOTAL\":\"166\",\"STEP_CAPACITY\":\"19.88\",\"TIMESTAMP\":\"2025-03-25T13:00:51\"},{\"STOCKER_NAME\":\"HFF09AGC0100\",\"STEP_ID\":\"8029\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"33\",\"TOTAL\":\"166\",\"STEP_CAPACITY\":\"19.88\",\"TIMESTAMP\":\"2025-03-25T13:00:51\"},{\"STOCKER_NAME\":\"HFF09AGC0100\",\"STEP_ID\":\"8027\",\"KOR_STEP_GROUP_NAME\":null,\"ENG_STEP_GROUP_NAME\":null,\"RACK_STEP_COUNT\":\"33\",\"TOTAL\":\"166\",\"STEP_CAPACITY\":\"19.88\",\"TIMESTAMP\":\"2025-03-25T13:00:51\"},{\"STOCKER_NAME\":\"HFF09AGC0100\",\"STEP_ID\":\"8042\",\"KOR_STEP_GROUP_NAME\":null,
}
}