Files
XRLib/Assets/Scripts/SHI/modal/NW/NWChartData.cs
2025-11-27 19:26:01 +09:00

182 lines
6.5 KiB
C#

using System;
using System.Collections.Generic;
namespace SHI.Modal.NW
{
/// <summary>
/// NW(네트워크 다이어그램) 차트의 개별 작업(Task) 데이터를 나타냅니다.
///
/// <para><b>개요:</b></para>
/// <para>
/// JSON 파일에서 역직렬화되어 NWChart에서 네트워크 다이어그램을 렌더링하는 데 사용됩니다.
/// 각 작업은 노드로 표시되며, ERE_NW_ACTV_CD와 ERE_NW_NXT_ACTV_CD로 노드 간 연결 관계를 정의합니다.
/// </para>
///
/// <para><b>네트워크 구조:</b></para>
/// <list type="bullet">
/// <item>ERE_NW_ACTV_CD - 현재 작업의 활동 코드 (노드 식별자)</item>
/// <item>ERE_NW_NXT_ACTV_CD - 다음 작업의 활동 코드 (연결 대상)</item>
/// <item>노드 간 연결선으로 작업 순서/의존성을 시각화</item>
/// </list>
///
/// <para><b>주요 필드:</b></para>
/// <list type="bullet">
/// <item>PROJ_NO, BLK_NO - 프로젝트 및 블록 식별자</item>
/// <item>STDT, FNDT - 시작일, 종료일</item>
/// <item>WKA_NM - 작업 영역명</item>
/// <item>PTCH - 패치 번호 (노드 위치 계산에 사용)</item>
/// </list>
///
/// <para><b>날짜 형식:</b></para>
/// <para>모든 날짜 필드는 "yyyyMMdd" 형식의 문자열입니다. (예: "20250115")</para>
/// </summary>
[Serializable]
public class NWChartDataTask
{
#region (Identifiers)
/// <summary>화면 번호 코드</summary>
public string SCRNO_CD;
/// <summary>활동 코드</summary>
public string ACTV_CD;
/// <summary>프로젝트 번호</summary>
public string PROJ_NO;
/// <summary>
/// 네트워크 활동 코드 (현재 노드 식별자).
/// 네트워크 다이어그램에서 노드를 고유하게 식별합니다.
/// </summary>
public string ERE_NW_ACTV_CD;
/// <summary>
/// 다음 네트워크 활동 코드 (연결 대상 노드).
/// 이 필드가 비어있으면 종료 노드(End Node)로 표시됩니다.
/// </summary>
public string ERE_NW_NXT_ACTV_CD;
/// <summary>블록 번호 (선박 건조 블록 식별자)</summary>
public string BLK_NO;
#endregion
#region (Schedule Information)
/// <summary>시작일 (yyyyMMdd 형식)</summary>
public string STDT;
/// <summary>종료일 (yyyyMMdd 형식)</summary>
public string FNDT;
#endregion
#region (Work Information)
/// <summary>작업 영역명</summary>
public string WKA_NM;
/// <summary>공정 단계</summary>
public string P_STG;
/// <summary>프로젝트 타입</summary>
public string PROJ_TP;
/// <summary>관계 타입</summary>
public string REL_TP;
#endregion
#region (Position and Connection)
/// <summary>패치 번호 (노드의 행 위치 결정에 사용)</summary>
public int? PTCH;
/// <summary>포인트 개수</summary>
public int? PT_CNT;
/// <summary>X1 좌표</summary>
public int? X1;
/// <summary>X2 좌표</summary>
public int? X2;
/// <summary>Y1 좌표</summary>
public int? Y1;
/// <summary>Y2 좌표</summary>
public int? Y2;
/// <summary>고정 여부 (Y/N)</summary>
public string FIX_YN;
#endregion
#region (Next Task Information)
/// <summary>다음 프로젝트 번호</summary>
public string NXT_PROJ_NO;
/// <summary>다음 프로젝트 타입</summary>
public string NXT_PROJ_TP;
/// <summary>다음 활동 설명</summary>
public string NXT_ACTV_DSC;
/// <summary>최소 지연(Lag) 시간</summary>
public int? MIN_LAG;
#endregion
#region (Calculated Values)
/// <summary>
/// 런타임에 계산되는 진행률 (0~100).
/// JSON 직렬화에서 제외됩니다.
/// </summary>
[NonSerialized] public float CalculatedProgress;
#endregion
#region (Date Conversion Methods)
/// <summary>시작일을 DateTime으로 반환합니다.</summary>
/// <returns>파싱된 DateTime 또는 null</returns>
public DateTime? GetStartDate() => ParseDate(STDT);
/// <summary>종료일을 DateTime으로 반환합니다.</summary>
/// <returns>파싱된 DateTime 또는 null</returns>
public DateTime? GetEndDate() => ParseDate(FNDT);
/// <summary>
/// yyyyMMdd 형식의 문자열을 DateTime으로 파싱합니다.
/// </summary>
/// <param name="dateStr">날짜 문자열 (예: "20250115")</param>
/// <returns>파싱된 DateTime 또는 null (빈 문자열이나 "null"인 경우)</returns>
private DateTime? ParseDate(string dateStr)
{
if (string.IsNullOrEmpty(dateStr) || dateStr == "null") return null;
if (DateTime.TryParseExact(dateStr, "yyyyMMdd", null, System.Globalization.DateTimeStyles.None, out DateTime date))
return date;
return null;
}
#endregion
#region (Display Methods)
/// <summary>
/// 작업의 표시 이름을 반환합니다.
/// BLK_NO, ERE_NW_ACTV_CD, ACTV_CD, PROJ_NO 순으로 첫 번째 유효한 값을 반환합니다.
/// </summary>
/// <returns>표시할 작업명</returns>
public string GetDisplayName()
{
if (!string.IsNullOrEmpty(BLK_NO)) return BLK_NO;
if (!string.IsNullOrEmpty(ERE_NW_ACTV_CD)) return ERE_NW_ACTV_CD;
return ACTV_CD ?? PROJ_NO;
}
#endregion
}
/// <summary>
/// NWChartDataTask 목록을 감싸는 래퍼 클래스입니다.
/// JSON 역직렬화 시 배열을 객체로 감싸기 위해 사용됩니다.
///
/// <para><b>사용 예시:</b></para>
/// <code>
/// var json = File.ReadAllText(path);
/// var wrapper = JsonUtility.FromJson&lt;NWChartDataWrapper&gt;("{\"items\":" + json + "}");
/// var tasks = wrapper.items;
/// </code>
/// </summary>
[Serializable]
public class NWChartDataWrapper
{
/// <summary>작업 데이터 목록</summary>
public List<NWChartDataTask> items;
}
}