Initial commit: WMS 교육 시뮬레이터 (입고 모듈 골격)

- Unity 6.4 URP 프로젝트 베이스
- Inbound 비즈니스 로직: Scan/Putaway/Scoring 서비스 + InboundManager
- 데이터 모델: Item/Location/Scenario (ScriptableObject) + StorageZone
- 샘플 시나리오 inbound_basic.json, 설계문서/목업 포함

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
jklee
2026-06-14 19:09:29 +09:00
commit 08ea11ea37
76 changed files with 8328 additions and 0 deletions
+37
View File
@@ -0,0 +1,37 @@
using System.Collections.Generic;
using UnityEngine;
namespace SinoWms.Data
{
/// <summary>
/// 입고 교육 시나리오. 입고예정 라인 + 교육용 "함정"(실수량 차이 등)을 담는다.
/// 코드 수정 없이 .asset 또는 JSON 으로 교체하여 고객사별 시나리오를 만든다.
/// </summary>
[CreateAssetMenu(fileName = "Scenario_", menuName = "SinoWMS/Inbound Scenario")]
public class InboundScenario : ScriptableObject
{
public string scenarioId;
public string title;
[Tooltip("제한 시간(초). 0이면 무제한.")]
public float timeLimitSeconds = 0f;
public List<InboundLine> lines = new List<InboundLine>();
}
/// <summary>입고예정 1줄 = 품목 1종.</summary>
[System.Serializable]
public class InboundLine
{
public ItemDefinition item;
[Tooltip("ASN상 예정 수량")]
public int expectedQty;
[Tooltip("실제 도착 수량. 예정과 다르면 검수 단계에서 교육 포인트가 된다.")]
public int actualQty;
[Tooltip("정답 로케이션(채점 기준). 비워두면 존/용량 규칙만으로 검증.")]
public LocationDefinition suggestedLocation;
}
}
+24
View File
@@ -0,0 +1,24 @@
using UnityEngine;
namespace SinoWms.Data
{
/// <summary>품목 마스터. 고객사별로 .asset 파일로 만들어 교체한다.</summary>
[CreateAssetMenu(fileName = "Item_", menuName = "SinoWMS/Item Definition")]
public class ItemDefinition : ScriptableObject
{
[Tooltip("재고 식별 코드 (SKU)")]
public string sku;
[Tooltip("품목명")]
public string displayName;
[Tooltip("스캔 대상 바코드 값")]
public string barcode;
[Tooltip("요구 보관 조건")]
public StorageZone requiredZone = StorageZone.Ambient;
[Tooltip("한 개당 차지하는 부피(용량 단위)")]
public int unitVolume = 1;
}
}
+21
View File
@@ -0,0 +1,21 @@
using UnityEngine;
namespace SinoWms.Data
{
/// <summary>로케이션(적치 위치) 마스터.</summary>
[CreateAssetMenu(fileName = "Loc_", menuName = "SinoWMS/Location Definition")]
public class LocationDefinition : ScriptableObject
{
[Tooltip("로케이션 코드 (예: A-01-03)")]
public string locationCode;
[Tooltip("이 로케이션이 지원하는 보관 조건")]
public StorageZone zone = StorageZone.Ambient;
[Tooltip("최대 수용 용량(부피 단위)")]
public int capacity = 100;
[Tooltip("탑다운 씬에서의 격자 좌표")]
public Vector2Int gridPosition;
}
}
+11
View File
@@ -0,0 +1,11 @@
namespace SinoWms.Data
{
/// <summary>보관 조건(존). 적치 규칙 검증에 사용된다.</summary>
public enum StorageZone
{
Ambient, // 상온
Chilled, // 냉장
Frozen, // 냉동
Hazardous // 위험물
}
}