Initial program flow page

This commit is contained in:
2026-06-23 17:56:00 +09:00
commit 5df369100a
12 changed files with 3639 additions and 0 deletions

6
.gitignore vendored Normal file
View File

@@ -0,0 +1,6 @@
node_modules/
dist/
.env
.env.*
.DS_Store
*.log

9
Dockerfile Normal file
View File

@@ -0,0 +1,9 @@
FROM node:22-alpine
WORKDIR /app
COPY package.json package-lock.json* ./
RUN npm install
COPY . .
EXPOSE 5173
CMD ["npm", "run", "dev", "--", "--host", "0.0.0.0"]

View File

@@ -0,0 +1,422 @@
{
"cheonjiin": {
"name": "천지인",
"description": "지형정보 생성",
"steps": [
{
"title": "자료수집",
"feature": "직접선택, 도면 불러오기",
"note": "사업 대상지와 원본 도면 범위를 확정하여 지형도, 수치지형도, 정사영상등 취득"
},
{
"title": "선택/검토",
"feature": "등고선, 레이어 선택",
"note": " 필요한 도면 요소와 레이어만 선택가능"
},
{
"title": "현장조사",
"feature": "지표(평면,종단,횡단,표고)\n지층(탄성파, 지질주상도, 종단, 횡단)\n상세(드론지형, PointCloud) 적용 후 지형, 지층 보정",
"note": "실측 자료를 반영해 지형 정보를 보정(dwg, dxf 파일 등)\n지층은 .bori파일만 지원\n3d 형상 내보내기 가능"
},
{
"title": "구조물편집",
"feature": "도로(방음벽, 난간),\n건물(텍스처, 외부모델),\n하천 배수구조물,\n지형(지표면, 지층, 구역텍스쳐)등 적용 후 모델재생성",
"note": "구조물과 지형 요소를 편집\n3d 형상 내보내기 가능"
},
{
"title": "유역면적",
"feature": "유역 구분 및 면적 산정",
"note": ""
}
],
"deliverables": [
"지형도",
"수치지형도",
"정사영상",
"지형,지층 보정 모델"
],
"format": "glb",
"predecessors": [],
"successors": [
"wayPrimal",
"program-1782180934346"
],
"detailGates": [
{
"key": "gate1",
"stepId": "1-1",
"question": "노선변경?",
"yes": "자료수집 재실행",
"no": "다음 검토",
"targetProgramId": "cheonjiin"
},
{
"key": "gate2",
"stepId": "1-2",
"question": "등고선 또는 적용 레이어 변경?",
"yes": "선택/검토 재실행",
"no": "다음 검토",
"targetProgramId": "cheonjiin"
},
{
"key": "gate3",
"stepId": "1-3",
"question": "지표(평면,종단,횡단,표고)\n지층(탄성파, 지질주상도, 종단, 횡단)\n상세(드론지형, PointCloud) 정보 변경?",
"yes": "현장조사 재실행",
"no": "다음 검토",
"targetProgramId": "cheonjiin"
},
{
"key": "gate4",
"stepId": "1-4",
"question": "도로(방음벽, 난간), 건물(텍스처, 외부모델),\n하천 배수구조물, 지형(지표면, 지층, 구역텍스쳐)등 정보 변경?",
"yes": "구조물편집 재실행",
"no": "WayPrimal로 이동",
"targetProgramId": "cheonjiin"
}
]
},
"wayPrimal": {
"name": "WayPrimal",
"description": "기본설계 성과물 생성",
"steps": [
{
"title": "설계조건",
"feature": "사업개요, 도로의 종류 등 설계기준 입력\n횡단구성, 포장, 비탈면경사 입력\n발파영향권 및 교량, 터널 형식 확인가능\n정온시설 위치 입력",
"note": "도로와 주변 조건등 적용기준 입력"
},
{
"title": "노폭계획",
"feature": "선형계획, 노즈, 편경사,\n구조물, 시설계획 입력",
"note": "노선의 폭, 선형, 구조물 조건 입력"
},
{
"title": "기본계획",
"feature": "길어깨편경사, 비탈면,\n부체도로, 횡단통로, 수로암거 계획 입력",
"note": "기본 단면과 주변 계획 조건 입력"
},
{
"title": "기본설계",
"feature": "선형 기준 배수공, 포장공, 부대공 자동설치\n횡단면도 생성, 도공계산서 내보내기",
"note": "자동 설계 성과물과 기본설계 모델을 생성"
}
],
"format": "way",
"deliverables": [
"평면도, 횡단면도, 종평면도, 기본설계모델"
],
"predecessors": [
"cheonjiin"
],
"successors": [
"program-1782180934346",
"program-1782201626309"
],
"linkLabel": "천지인 결과물을 WayPrimal로 연계",
"linkSourceIds": [
"cheonjiin"
],
"linkSourceId": "cheonjiin",
"detailGates": [
{
"key": "gate5-1782181928630",
"stepId": "1-1",
"question": "노선 구역 변경?",
"yes": "천지인 재실행",
"no": "변경사항 없음",
"targetProgramId": "cheonjiin"
},
{
"key": "gate6-1782188756313",
"targetProgramId": "wayPrimal",
"stepId": "wp-1",
"question": "사업개요, 도로의 종류 등 설계기준 변경?",
"yes": "설계조건 재실행",
"no": "다음 검토"
},
{
"key": "gate1",
"stepId": "wp-1",
"question": "적용조건 입력(횡단구성, 비탈면 경사, 포장단면 등) 정온시설 위치 입력 변경?",
"yes": "설계조건 재실행",
"no": "다음 검토"
},
{
"key": "gate2",
"stepId": "wp-2",
"question": "선형계획, 노즈, 편경사, 구조물, 시설계획 변경?",
"yes": "노폭계획 재실행",
"no": "다음 검토"
},
{
"key": "gate3",
"stepId": "wp-3",
"question": "길어깨편경사, 비탈면계획, 부체도로, 횡단통로 변경?",
"yes": "기본계획 재실행",
"no": "다음 검토"
},
{
"key": "gate5-1782182405217",
"targetProgramId": "wayPrimal",
"stepId": "wp-4",
"question": "배수공, 포장공, 부대공 변경?",
"yes": "기본설계 재실행",
"no": "WayConfirm으로 이동"
}
]
},
"extraPrograms": [
{
"id": "program-1782201626309",
"name": "WayConfirm",
"description": "새 프로그램 업무 플로우",
"steps": [
{
"id": "program-1782201626309-2",
"title": "-",
"feature": "-",
"note": "-"
}
],
"format": "way",
"deliverables": [
"설계도면, 수량산출서, 3D모델"
],
"predecessors": [
"wayPrimal"
],
"successors": [
"program-1782180934346",
"program-1782191391645",
"program-1782194494893"
],
"linkLabel": "이전 프로그램 산출물을 새 프로그램 입력으로 연계"
},
{
"id": "program-1782194494893",
"name": "WallZainer",
"description": "옹벽 설계 프로그램",
"steps": [
{
"id": "program-1782194494893-1",
"title": "현황 및 설계조건",
"feature": "사업개요, 옹벽리스트, 지역조건, 설계조건 입력",
"note": "사업구간내 옹벽 현황과 설계조건 입력"
},
{
"id": "program-1782194494893-1782194544681-5",
"title": "계획",
"feature": "평면, 종단면도 확인 및 횡단면도에서 문양거푸집 및 상세 사이즈(하단폭, 뒷굽길이) 변경 입력",
"note": "단면확인 및 블럭별 치수변경(지정폭만 변경가능)"
},
{
"id": "program-1782194494893-2",
"title": "모델링 및 하중재하",
"feature": "옹벽의 단면형상 및 상세치수 확인 및 구조해석 확인",
"note": "사용자 입력사항 없는 확인 페이지"
},
{
"id": "program-1782194494893-1782194542462-3",
"title": "부재력 및 반력",
"feature": "구조해석 통해 구해진 블럭, 하중조건별 \n부재력(휨모멘트, 전단력) 및 반력, 토압, \n연직변위 값 확인",
"note": "사용자 입력사항 없는 확인 페이지"
},
{
"id": "program-1782194494893-1782194542837-4",
"title": "안정성검토",
"feature": "지지력, 침하량 확인",
"note": "NG시 단면치수 변경"
},
{
"id": "program-1782194494893-1782195438993-6",
"title": "설계최적화",
"feature": "프로그램이 넘어가지 않아서 이후 확인 불가\n",
"note": "단계 설명을 입력합니다."
}
],
"format": "rtwl",
"deliverables": [
"설계도면, 계산서, 수량산출서, 3D모델"
],
"linkLabel": "Way에서 나온 구조물을 각 프로그램에 연계",
"detailGates": [
{
"key": "gate1",
"targetProgramId": "program-1782194494893",
"stepId": "program-1782194494893-1",
"question": "현황 및 설계조건 변경?",
"yes": "현황 및 설계조건 재실행",
"no": "아니오: 다음 검토"
},
{
"key": "gate2-1782196512625",
"targetProgramId": "program-1782194494893",
"stepId": "program-1782194494893-1782194544681-5",
"question": "NG?",
"yes": "계획 재실행(치수변경)",
"no": "아니오: 변경사항 없음"
}
],
"predecessors": [
"program-1782201626309"
],
"successors": [
"program-1782180934346"
]
},
{
"id": "program-1782191391645",
"name": "BridgeModeler",
"description": "구조물 상세치수 수정 후 모델 생성 (전환BIM 전용 프로그램) - 철근 X",
"steps": [
{
"id": "program-1782191391645-1",
"title": "공통",
"feature": "교량의 형식, 포장, 접속시스템(교대형식), 앞성토 형태 선택",
"note": "교량 공통 형식 선정"
},
{
"id": "program-1782191391645-2",
"title": "상부",
"feature": "거더&가로보, 바닥판의 상세 형식 및 상세치수 입력",
"note": "교량 상부 변수 입력\n(전환BIM - 도면 치수 입력)"
},
{
"id": "program-1782191391645-3",
"title": "교대",
"feature": "교좌면, 흉벽, 벽체, 기초, 날개벽, 접속슬래브 형식 및 상세치수 입력",
"note": "교대 변수 입력\n(전환BIM - 도면 치수 입력)"
},
{
"id": "program-1782191391645-4",
"title": "교각",
"feature": "교좌면, 코핑, 기둥, 기초 형식 및 상세치수 입력",
"note": "교대 변수 입력\n(전환BIM - 도면 치수 입력)"
}
],
"format": "obj",
"deliverables": [
"3D 모델"
],
"linkSourceIds": [
"program-1782180934346"
],
"linkLabel": "Way에서 나온 구조물을 각 프로그램에 연계",
"detailGates": [
{
"key": "gate1",
"targetProgramId": "program-1782191391645",
"stepId": "program-1782191391645-1",
"question": "교량의 형식, 포장, 접속시스템(교대형식), \n앞성토 형태수 변경?",
"yes": "공통 페이지 재실행",
"no": "다음 검토"
},
{
"key": "gate2",
"targetProgramId": "program-1782191391645",
"stepId": "program-1782191391645-2",
"question": "상부 거더&가로보,\n바닥판의 상세 형식 및 치수 변경?",
"yes": "상부 페이지 재실행",
"no": "다음 검토"
},
{
"key": "gate3",
"targetProgramId": "program-1782191391645",
"stepId": "program-1782191391645-3",
"question": "교대 교좌면, 흉벽, 벽체, 기초, 날개벽,\n접속슬래브 형식 및 치수 변경?",
"yes": "교대 페이지 재실행",
"no": "다음 검토"
},
{
"key": "gate4-1782192060008",
"targetProgramId": "program-1782191391645",
"stepId": "program-1782191391645-4",
"question": "교각교좌면, 코핑, 기둥, 기초 형식 및 치수 변경?",
"yes": "교각 페이지 재실행",
"no": "Rhino에서 모델 확인"
}
],
"predecessors": [
"program-1782201626309"
],
"successors": [
"program-1782180934346"
]
},
{
"id": "program-1782180934346",
"name": "Rhino",
"description": "3D 모델 편집 및 포맷 변경",
"steps": [
{
"id": "program-1782180934346-1",
"title": "모델병합 및 수정",
"feature": "모델의 정합성 확인 및 편집\n기본기능 및 Grasshopper 사용",
"note": "Way 파일 내 도로 형상 모델 추출 시WayExport3DAppo를 사용하여 obj 모델 생성\n그 외의 구조물을 각 프로그램에서 obj 불러오기"
},
{
"id": "program-1782180934346-2",
"title": "속성정보",
"feature": "속성정보 입력\n현재 Plugin에 도로정보만 자동으로 입력",
"note": "Plugin 설치하여 객체별 WBS 정보 입력"
},
{
"id": "program-1782180934346-3",
"title": "3단계",
"feature": "wpbifc 포맷으로 저장",
"note": "설치된 Plugin에서 wbpifc 포맷으로 저장"
},
{
"id": "program-1782180934346-4",
"title": "중립포맷 생성",
"feature": "ifc파일 생성",
"note": "DataChange 프로그램 사용으로 ifc 파일 추출"
}
],
"format": "obj, wbpifc, ifc",
"deliverables": [
"3D 모델"
],
"linkLabel": "생성 모델 확인 및 변경",
"detailGates": [
{
"key": "gate2-1782192916845",
"targetProgramId": "wayPrimal",
"stepId": "wp-1",
"question": "도로 모델 변경?",
"yes": "Way 재실행",
"no": "아니오: 변경사항 없음"
},
{
"key": "gate1",
"targetProgramId": "program-1782191391645",
"stepId": "program-1782191391645-1",
"question": "교량 구조물 모델 상세 치수 변경?",
"yes": "BridgeModeler 재실행",
"no": "아니오: 다음 검토"
},
{
"key": "gate3-1782194421761",
"targetProgramId": "program-1782180934346",
"stepId": "program-1782180934346-3",
"question": "Wall 구조물 모델 상세 치수 변경?",
"yes": "예: 3단계 재진입",
"no": "아니오: 변경사항 없음"
}
],
"linkSourceId": "wayPrimal",
"linkSourceIds": [
"wayPrimal",
"cheonjiin"
],
"predecessors": [
"program-1782191391645",
"program-1782194494893",
"cheonjiin",
"wayPrimal",
"program-1782201626309"
],
"successors": []
}
]
}

File diff suppressed because one or more lines are too long

426
data/flow-db.json Normal file
View File

@@ -0,0 +1,426 @@
{
"content": {
"cheonjiin": {
"name": "천지인",
"description": "지형정보 생성",
"steps": [
{
"title": "자료수집",
"feature": "직접선택, 도면 불러오기",
"note": "사업 대상지와 원본 도면 범위를 확정하여 지형도, 수치지형도, 정사영상등 취득"
},
{
"title": "선택/검토",
"feature": "등고선, 레이어 선택",
"note": " 필요한 도면 요소와 레이어만 선택가능"
},
{
"title": "현장조사",
"feature": "지표(평면,종단,횡단,표고)\n지층(탄성파, 지질주상도, 종단, 횡단)\n상세(드론지형, PointCloud) 적용 후 지형, 지층 보정",
"note": "실측 자료를 반영해 지형 정보를 보정(dwg, dxf 파일 등)\n지층은 .bori파일만 지원\n3d 형상 내보내기 가능"
},
{
"title": "구조물편집",
"feature": "도로(방음벽, 난간),\n건물(텍스처, 외부모델),\n하천 배수구조물,\n지형(지표면, 지층, 구역텍스쳐)등 적용 후 모델재생성",
"note": "구조물과 지형 요소를 편집\n3d 형상 내보내기 가능"
},
{
"title": "유역면적",
"feature": "유역 구분 및 면적 산정",
"note": ""
}
],
"deliverables": [
"지형도",
"수치지형도",
"정사영상",
"지형,지층 보정 모델"
],
"format": "glb",
"predecessors": [],
"successors": [
"wayPrimal",
"program-1782180934346"
],
"detailGates": [
{
"key": "gate1",
"stepId": "1-1",
"question": "노선변경?",
"yes": "자료수집 재실행",
"no": "다음 검토",
"targetProgramId": "cheonjiin"
},
{
"key": "gate2",
"stepId": "1-2",
"question": "등고선 또는 적용 레이어 변경?",
"yes": "선택/검토 재실행",
"no": "다음 검토",
"targetProgramId": "cheonjiin"
},
{
"key": "gate3",
"stepId": "1-3",
"question": "지표(평면,종단,횡단,표고)\n지층(탄성파, 지질주상도, 종단, 횡단)\n상세(드론지형, PointCloud) 정보 변경?",
"yes": "현장조사 재실행",
"no": "다음 검토",
"targetProgramId": "cheonjiin"
},
{
"key": "gate4",
"stepId": "1-4",
"question": "도로(방음벽, 난간), 건물(텍스처, 외부모델),\n하천 배수구조물, 지형(지표면, 지층, 구역텍스쳐)등 정보 변경?",
"yes": "구조물편집 재실행",
"no": "WayPrimal로 이동",
"targetProgramId": "cheonjiin"
}
]
},
"wayPrimal": {
"name": "WayPrimal",
"description": "기본설계 성과물 생성",
"steps": [
{
"title": "설계조건",
"feature": "사업개요, 도로의 종류 등 설계기준 입력\n횡단구성, 포장, 비탈면경사 입력\n발파영향권 및 교량, 터널 형식 확인가능\n정온시설 위치 입력",
"note": "도로와 주변 조건등 적용기준 입력"
},
{
"title": "노폭계획",
"feature": "선형계획, 노즈, 편경사,\n구조물, 시설계획 입력",
"note": "노선의 폭, 선형, 구조물 조건 입력"
},
{
"title": "기본계획",
"feature": "길어깨편경사, 비탈면,\n부체도로, 횡단통로, 수로암거 계획 입력",
"note": "기본 단면과 주변 계획 조건 입력"
},
{
"title": "기본설계",
"feature": "선형 기준 배수공, 포장공, 부대공 자동설치\n횡단면도 생성, 도공계산서 내보내기",
"note": "자동 설계 성과물과 기본설계 모델을 생성"
}
],
"format": "way",
"deliverables": [
"평면도, 횡단면도, 종평면도, 기본설계모델"
],
"predecessors": [
"cheonjiin"
],
"successors": [
"program-1782180934346",
"program-1782201626309"
],
"linkLabel": "천지인 결과물을 WayPrimal로 연계",
"linkSourceIds": [
"cheonjiin"
],
"linkSourceId": "cheonjiin",
"detailGates": [
{
"key": "gate5-1782181928630",
"stepId": "1-1",
"question": "노선 구역 변경?",
"yes": "천지인 재실행",
"no": "변경사항 없음",
"targetProgramId": "cheonjiin"
},
{
"key": "gate6-1782188756313",
"targetProgramId": "wayPrimal",
"stepId": "wp-1",
"question": "사업개요, 도로의 종류 등 설계기준 변경?",
"yes": "설계조건 재실행",
"no": "다음 검토"
},
{
"key": "gate1",
"stepId": "wp-1",
"question": "적용조건 입력(횡단구성, 비탈면 경사, 포장단면 등) 정온시설 위치 입력 변경?",
"yes": "설계조건 재실행",
"no": "다음 검토"
},
{
"key": "gate2",
"stepId": "wp-2",
"question": "선형계획, 노즈, 편경사, 구조물, 시설계획 변경?",
"yes": "노폭계획 재실행",
"no": "다음 검토"
},
{
"key": "gate3",
"stepId": "wp-3",
"question": "길어깨편경사, 비탈면계획, 부체도로, 횡단통로 변경?",
"yes": "기본계획 재실행",
"no": "다음 검토"
},
{
"key": "gate5-1782182405217",
"targetProgramId": "wayPrimal",
"stepId": "wp-4",
"question": "배수공, 포장공, 부대공 변경?",
"yes": "기본설계 재실행",
"no": "WayConfirm으로 이동"
}
]
},
"extraPrograms": [
{
"id": "program-1782201626309",
"name": "WayConfirm",
"description": "새 프로그램 업무 플로우",
"steps": [
{
"id": "program-1782201626309-2",
"title": "-",
"feature": "-",
"note": "-"
}
],
"format": "way",
"deliverables": [
"설계도면, 수량산출서, 3D모델"
],
"predecessors": [
"wayPrimal"
],
"successors": [
"program-1782180934346",
"program-1782191391645",
"program-1782194494893"
],
"linkLabel": "이전 프로그램 산출물을 새 프로그램 입력으로 연계"
},
{
"id": "program-1782194494893",
"name": "WallZainer",
"description": "옹벽 설계 프로그램",
"steps": [
{
"id": "program-1782194494893-1",
"title": "현황 및 설계조건",
"feature": "사업개요, 옹벽리스트, 지역조건, 설계조건 입력",
"note": "사업구간내 옹벽 현황과 설계조건 입력"
},
{
"id": "program-1782194494893-1782194544681-5",
"title": "계획",
"feature": "평면, 종단면도 확인 및 횡단면도에서 문양거푸집 및 상세 사이즈(하단폭, 뒷굽길이) 변경 입력",
"note": "단면확인 및 블럭별 치수변경(지정폭만 변경가능)"
},
{
"id": "program-1782194494893-2",
"title": "모델링 및 하중재하",
"feature": "옹벽의 단면형상 및 상세치수 확인 및 구조해석 확인",
"note": "사용자 입력사항 없는 확인 페이지"
},
{
"id": "program-1782194494893-1782194542462-3",
"title": "부재력 및 반력",
"feature": "구조해석 통해 구해진 블럭, 하중조건별 \n부재력(휨모멘트, 전단력) 및 반력, 토압, \n연직변위 값 확인",
"note": "사용자 입력사항 없는 확인 페이지"
},
{
"id": "program-1782194494893-1782194542837-4",
"title": "안정성검토",
"feature": "지지력, 침하량 확인",
"note": "NG시 단면치수 변경"
},
{
"id": "program-1782194494893-1782195438993-6",
"title": "설계최적화",
"feature": "프로그램이 넘어가지 않아서 이후 확인 불가\n",
"note": "단계 설명을 입력합니다."
}
],
"format": "rtwl",
"deliverables": [
"설계도면, 계산서, 수량산출서, 3D모델"
],
"linkLabel": "Way에서 나온 구조물을 각 프로그램에 연계",
"detailGates": [
{
"key": "gate1",
"targetProgramId": "program-1782194494893",
"stepId": "program-1782194494893-1",
"question": "현황 및 설계조건 변경?",
"yes": "현황 및 설계조건 재실행",
"no": "아니오: 다음 검토"
},
{
"key": "gate2-1782196512625",
"targetProgramId": "program-1782194494893",
"stepId": "program-1782194494893-1782194544681-5",
"question": "NG?",
"yes": "계획 재실행(치수변경)",
"no": "아니오: 변경사항 없음"
}
],
"predecessors": [
"program-1782201626309"
],
"successors": [
"program-1782180934346"
]
},
{
"id": "program-1782191391645",
"name": "BridgeModeler",
"description": "구조물 상세치수 수정 후 모델 생성 (전환BIM 전용 프로그램) - 철근 X",
"steps": [
{
"id": "program-1782191391645-1",
"title": "공통",
"feature": "교량의 형식, 포장, 접속시스템(교대형식), 앞성토 형태 선택",
"note": "교량 공통 형식 선정"
},
{
"id": "program-1782191391645-2",
"title": "상부",
"feature": "거더&가로보, 바닥판의 상세 형식 및 상세치수 입력",
"note": "교량 상부 변수 입력\n(전환BIM - 도면 치수 입력)"
},
{
"id": "program-1782191391645-3",
"title": "교대",
"feature": "교좌면, 흉벽, 벽체, 기초, 날개벽, 접속슬래브 형식 및 상세치수 입력",
"note": "교대 변수 입력\n(전환BIM - 도면 치수 입력)"
},
{
"id": "program-1782191391645-4",
"title": "교각",
"feature": "교좌면, 코핑, 기둥, 기초 형식 및 상세치수 입력",
"note": "교대 변수 입력\n(전환BIM - 도면 치수 입력)"
}
],
"format": "obj",
"deliverables": [
"3D 모델"
],
"linkSourceIds": [
"program-1782180934346"
],
"linkLabel": "Way에서 나온 구조물을 각 프로그램에 연계",
"detailGates": [
{
"key": "gate1",
"targetProgramId": "program-1782191391645",
"stepId": "program-1782191391645-1",
"question": "교량의 형식, 포장, 접속시스템(교대형식), \n앞성토 형태수 변경?",
"yes": "공통 페이지 재실행",
"no": "다음 검토"
},
{
"key": "gate2",
"targetProgramId": "program-1782191391645",
"stepId": "program-1782191391645-2",
"question": "상부 거더&가로보,\n바닥판의 상세 형식 및 치수 변경?",
"yes": "상부 페이지 재실행",
"no": "다음 검토"
},
{
"key": "gate3",
"targetProgramId": "program-1782191391645",
"stepId": "program-1782191391645-3",
"question": "교대 교좌면, 흉벽, 벽체, 기초, 날개벽,\n접속슬래브 형식 및 치수 변경?",
"yes": "교대 페이지 재실행",
"no": "다음 검토"
},
{
"key": "gate4-1782192060008",
"targetProgramId": "program-1782191391645",
"stepId": "program-1782191391645-4",
"question": "교각교좌면, 코핑, 기둥, 기초 형식 및 치수 변경?",
"yes": "교각 페이지 재실행",
"no": "Rhino에서 모델 확인"
}
],
"predecessors": [
"program-1782201626309"
],
"successors": [
"program-1782180934346"
]
},
{
"id": "program-1782180934346",
"name": "Rhino",
"description": "3D 모델 편집 및 포맷 변경",
"steps": [
{
"id": "program-1782180934346-1",
"title": "모델병합 및 수정",
"feature": "모델의 정합성 확인 및 편집\n기본기능 및 Grasshopper 사용",
"note": "Way 파일 내 도로 형상 모델 추출 시WayExport3DAppo를 사용하여 obj 모델 생성\n그 외의 구조물을 각 프로그램에서 obj 불러오기"
},
{
"id": "program-1782180934346-2",
"title": "속성정보",
"feature": "속성정보 입력\n현재 Plugin에 도로정보만 자동으로 입력",
"note": "Plugin 설치하여 객체별 WBS 정보 입력"
},
{
"id": "program-1782180934346-3",
"title": "3단계",
"feature": "wpbifc 포맷으로 저장",
"note": "설치된 Plugin에서 wbpifc 포맷으로 저장"
},
{
"id": "program-1782180934346-4",
"title": "중립포맷 생성",
"feature": "ifc파일 생성",
"note": "DataChange 프로그램 사용으로 ifc 파일 추출"
}
],
"format": "obj, wbpifc, ifc",
"deliverables": [
"3D 모델"
],
"linkLabel": "생성 모델 확인 및 변경",
"detailGates": [
{
"key": "gate2-1782192916845",
"targetProgramId": "wayPrimal",
"stepId": "wp-1",
"question": "도로 모델 변경?",
"yes": "Way 재실행",
"no": "아니오: 변경사항 없음"
},
{
"key": "gate1",
"targetProgramId": "program-1782191391645",
"stepId": "program-1782191391645-1",
"question": "교량 구조물 모델 상세 치수 변경?",
"yes": "BridgeModeler 재실행",
"no": "아니오: 다음 검토"
},
{
"key": "gate3-1782194421761",
"targetProgramId": "program-1782180934346",
"stepId": "program-1782180934346-3",
"question": "Wall 구조물 모델 상세 치수 변경?",
"yes": "예: 3단계 재진입",
"no": "아니오: 변경사항 없음"
}
],
"linkSourceId": "wayPrimal",
"linkSourceIds": [
"wayPrimal",
"cheonjiin"
],
"predecessors": [
"program-1782191391645",
"program-1782194494893",
"cheonjiin",
"wayPrimal",
"program-1782201626309"
],
"successors": []
}
]
},
"programStates": {},
"updatedAt": "2026-06-23T08:50:22.594Z"
}

14
flow.html Normal file
View File

@@ -0,0 +1,14 @@
<!doctype html>
<html lang="ko">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>유역면적 산정 피드백 엔진</title>
<link rel="icon" href="data:," />
<script src="https://cdn.tailwindcss.com"></script>
</head>
<body>
<div id="root"></div>
<script type="module" src="/src/main.jsx"></script>
</body>
</html>

14
index.html Normal file
View File

@@ -0,0 +1,14 @@
<!doctype html>
<html lang="ko">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>유역면적 산정 피드백 엔진</title>
<link rel="icon" href="data:," />
<script src="https://cdn.tailwindcss.com"></script>
</head>
<body>
<div id="root"></div>
<script type="module" src="/src/main.jsx"></script>
</body>
</html>

13
package.json Normal file
View File

@@ -0,0 +1,13 @@
{
"scripts": {
"dev": "vite --host 0.0.0.0"
},
"dependencies": {
"@vitejs/plugin-react": "^4.3.4",
"vite": "^6.0.5",
"react": "^18.3.1",
"react-dom": "^18.3.1",
"lucide-react": "^0.468.0"
},
"devDependencies": {}
}

422
recovered-content.json Normal file
View File

@@ -0,0 +1,422 @@
{
"cheonjiin": {
"name": "천지인",
"description": "지형정보 생성",
"steps": [
{
"title": "자료수집",
"feature": "직접선택, 도면 불러오기",
"note": "사업 대상지와 원본 도면 범위를 확정하여 지형도, 수치지형도, 정사영상등 취득"
},
{
"title": "선택/검토",
"feature": "등고선, 레이어 선택",
"note": " 필요한 도면 요소와 레이어만 선택가능"
},
{
"title": "현장조사",
"feature": "지표(평면,종단,횡단,표고)\n지층(탄성파, 지질주상도, 종단, 횡단)\n상세(드론지형, PointCloud) 적용 후 지형, 지층 보정",
"note": "실측 자료를 반영해 지형 정보를 보정(dwg, dxf 파일 등)\n지층은 .bori파일만 지원\n3d 형상 내보내기 가능"
},
{
"title": "구조물편집",
"feature": "도로(방음벽, 난간),\n건물(텍스처, 외부모델),\n하천 배수구조물,\n지형(지표면, 지층, 구역텍스쳐)등 적용 후 모델재생성",
"note": "구조물과 지형 요소를 편집\n3d 형상 내보내기 가능"
},
{
"title": "유역면적",
"feature": "유역 구분 및 면적 산정",
"note": ""
}
],
"deliverables": [
"지형도",
"수치지형도",
"정사영상",
"지형,지층 보정 모델"
],
"format": "glb",
"predecessors": [],
"successors": [
"wayPrimal",
"program-1782180934346"
],
"detailGates": [
{
"key": "gate1",
"stepId": "1-1",
"question": "노선변경?",
"yes": "자료수집 재실행",
"no": "다음 검토",
"targetProgramId": "cheonjiin"
},
{
"key": "gate2",
"stepId": "1-2",
"question": "등고선 또는 적용 레이어 변경?",
"yes": "선택/검토 재실행",
"no": "다음 검토",
"targetProgramId": "cheonjiin"
},
{
"key": "gate3",
"stepId": "1-3",
"question": "지표(평면,종단,횡단,표고)\n지층(탄성파, 지질주상도, 종단, 횡단)\n상세(드론지형, PointCloud) 정보 변경?",
"yes": "현장조사 재실행",
"no": "다음 검토",
"targetProgramId": "cheonjiin"
},
{
"key": "gate4",
"stepId": "1-4",
"question": "도로(방음벽, 난간), 건물(텍스처, 외부모델),\n하천 배수구조물, 지형(지표면, 지층, 구역텍스쳐)등 정보 변경?",
"yes": "구조물편집 재실행",
"no": "WayPrimal로 이동",
"targetProgramId": "cheonjiin"
}
]
},
"wayPrimal": {
"name": "WayPrimal",
"description": "기본설계 성과물 생성",
"steps": [
{
"title": "설계조건",
"feature": "사업개요, 도로의 종류 등 설계기준 입력\n횡단구성, 포장, 비탈면경사 입력\n발파영향권 및 교량, 터널 형식 확인가능\n정온시설 위치 입력",
"note": "도로와 주변 조건등 적용기준 입력"
},
{
"title": "노폭계획",
"feature": "선형계획, 노즈, 편경사,\n구조물, 시설계획 입력",
"note": "노선의 폭, 선형, 구조물 조건 입력"
},
{
"title": "기본계획",
"feature": "길어깨편경사, 비탈면,\n부체도로, 횡단통로, 수로암거 계획 입력",
"note": "기본 단면과 주변 계획 조건 입력"
},
{
"title": "기본설계",
"feature": "선형 기준 배수공, 포장공, 부대공 자동설치\n횡단면도 생성, 도공계산서 내보내기",
"note": "자동 설계 성과물과 기본설계 모델을 생성"
}
],
"format": "way",
"deliverables": [
"평면도, 횡단면도, 종평면도, 기본설계모델"
],
"predecessors": [
"cheonjiin"
],
"successors": [
"program-1782180934346",
"program-1782201626309"
],
"linkLabel": "천지인 결과물을 WayPrimal로 연계",
"linkSourceIds": [
"cheonjiin"
],
"linkSourceId": "cheonjiin",
"detailGates": [
{
"key": "gate5-1782181928630",
"stepId": "1-1",
"question": "노선 구역 변경?",
"yes": "천지인 재실행",
"no": "변경사항 없음",
"targetProgramId": "cheonjiin"
},
{
"key": "gate6-1782188756313",
"targetProgramId": "wayPrimal",
"stepId": "wp-1",
"question": "사업개요, 도로의 종류 등 설계기준 변경?",
"yes": "설계조건 재실행",
"no": "다음 검토"
},
{
"key": "gate1",
"stepId": "wp-1",
"question": "적용조건 입력(횡단구성, 비탈면 경사, 포장단면 등) 정온시설 위치 입력 변경?",
"yes": "설계조건 재실행",
"no": "다음 검토"
},
{
"key": "gate2",
"stepId": "wp-2",
"question": "선형계획, 노즈, 편경사, 구조물, 시설계획 변경?",
"yes": "노폭계획 재실행",
"no": "다음 검토"
},
{
"key": "gate3",
"stepId": "wp-3",
"question": "길어깨편경사, 비탈면계획, 부체도로, 횡단통로 변경?",
"yes": "기본계획 재실행",
"no": "다음 검토"
},
{
"key": "gate5-1782182405217",
"targetProgramId": "wayPrimal",
"stepId": "wp-4",
"question": "배수공, 포장공, 부대공 변경?",
"yes": "기본설계 재실행",
"no": "WayConfirm으로 이동"
}
]
},
"extraPrograms": [
{
"id": "program-1782201626309",
"name": "WayConfirm",
"description": "새 프로그램 업무 플로우",
"steps": [
{
"id": "program-1782201626309-2",
"title": "-",
"feature": "-",
"note": "-"
}
],
"format": "way",
"deliverables": [
"설계도면, 수량산출서, 3D모델"
],
"predecessors": [
"wayPrimal"
],
"successors": [
"program-1782180934346",
"program-1782191391645",
"program-1782194494893"
],
"linkLabel": "이전 프로그램 산출물을 새 프로그램 입력으로 연계"
},
{
"id": "program-1782194494893",
"name": "WallZainer",
"description": "옹벽 설계 프로그램",
"steps": [
{
"id": "program-1782194494893-1",
"title": "현황 및 설계조건",
"feature": "사업개요, 옹벽리스트, 지역조건, 설계조건 입력",
"note": "사업구간내 옹벽 현황과 설계조건 입력"
},
{
"id": "program-1782194494893-1782194544681-5",
"title": "계획",
"feature": "평면, 종단면도 확인 및 횡단면도에서 문양거푸집 및 상세 사이즈(하단폭, 뒷굽길이) 변경 입력",
"note": "단면확인 및 블럭별 치수변경(지정폭만 변경가능)"
},
{
"id": "program-1782194494893-2",
"title": "모델링 및 하중재하",
"feature": "옹벽의 단면형상 및 상세치수 확인 및 구조해석 확인",
"note": "사용자 입력사항 없는 확인 페이지"
},
{
"id": "program-1782194494893-1782194542462-3",
"title": "부재력 및 반력",
"feature": "구조해석 통해 구해진 블럭, 하중조건별 \n부재력(휨모멘트, 전단력) 및 반력, 토압, \n연직변위 값 확인",
"note": "사용자 입력사항 없는 확인 페이지"
},
{
"id": "program-1782194494893-1782194542837-4",
"title": "안정성검토",
"feature": "지지력, 침하량 확인",
"note": "NG시 단면치수 변경"
},
{
"id": "program-1782194494893-1782195438993-6",
"title": "설계최적화",
"feature": "프로그램이 넘어가지 않아서 이후 확인 불가\n",
"note": "단계 설명을 입력합니다."
}
],
"format": "rtwl",
"deliverables": [
"설계도면, 계산서, 수량산출서, 3D모델"
],
"linkLabel": "Way에서 나온 구조물을 각 프로그램에 연계",
"detailGates": [
{
"key": "gate1",
"targetProgramId": "program-1782194494893",
"stepId": "program-1782194494893-1",
"question": "현황 및 설계조건 변경?",
"yes": "현황 및 설계조건 재실행",
"no": "아니오: 다음 검토"
},
{
"key": "gate2-1782196512625",
"targetProgramId": "program-1782194494893",
"stepId": "program-1782194494893-1782194544681-5",
"question": "NG?",
"yes": "계획 재실행(치수변경)",
"no": "아니오: 변경사항 없음"
}
],
"predecessors": [
"program-1782201626309"
],
"successors": [
"program-1782180934346"
]
},
{
"id": "program-1782191391645",
"name": "BridgeModeler",
"description": "구조물 상세치수 수정 후 모델 생성 (전환BIM 전용 프로그램) - 철근 X",
"steps": [
{
"id": "program-1782191391645-1",
"title": "공통",
"feature": "교량의 형식, 포장, 접속시스템(교대형식), 앞성토 형태 선택",
"note": "교량 공통 형식 선정"
},
{
"id": "program-1782191391645-2",
"title": "상부",
"feature": "거더&가로보, 바닥판의 상세 형식 및 상세치수 입력",
"note": "교량 상부 변수 입력\n(전환BIM - 도면 치수 입력)"
},
{
"id": "program-1782191391645-3",
"title": "교대",
"feature": "교좌면, 흉벽, 벽체, 기초, 날개벽, 접속슬래브 형식 및 상세치수 입력",
"note": "교대 변수 입력\n(전환BIM - 도면 치수 입력)"
},
{
"id": "program-1782191391645-4",
"title": "교각",
"feature": "교좌면, 코핑, 기둥, 기초 형식 및 상세치수 입력",
"note": "교대 변수 입력\n(전환BIM - 도면 치수 입력)"
}
],
"format": "obj",
"deliverables": [
"3D 모델"
],
"linkSourceIds": [
"program-1782180934346"
],
"linkLabel": "Way에서 나온 구조물을 각 프로그램에 연계",
"detailGates": [
{
"key": "gate1",
"targetProgramId": "program-1782191391645",
"stepId": "program-1782191391645-1",
"question": "교량의 형식, 포장, 접속시스템(교대형식), \n앞성토 형태수 변경?",
"yes": "공통 페이지 재실행",
"no": "다음 검토"
},
{
"key": "gate2",
"targetProgramId": "program-1782191391645",
"stepId": "program-1782191391645-2",
"question": "상부 거더&가로보,\n바닥판의 상세 형식 및 치수 변경?",
"yes": "상부 페이지 재실행",
"no": "다음 검토"
},
{
"key": "gate3",
"targetProgramId": "program-1782191391645",
"stepId": "program-1782191391645-3",
"question": "교대 교좌면, 흉벽, 벽체, 기초, 날개벽,\n접속슬래브 형식 및 치수 변경?",
"yes": "교대 페이지 재실행",
"no": "다음 검토"
},
{
"key": "gate4-1782192060008",
"targetProgramId": "program-1782191391645",
"stepId": "program-1782191391645-4",
"question": "교각교좌면, 코핑, 기둥, 기초 형식 및 치수 변경?",
"yes": "교각 페이지 재실행",
"no": "Rhino에서 모델 확인"
}
],
"predecessors": [
"program-1782201626309"
],
"successors": [
"program-1782180934346"
]
},
{
"id": "program-1782180934346",
"name": "Rhino",
"description": "3D 모델 편집 및 포맷 변경",
"steps": [
{
"id": "program-1782180934346-1",
"title": "모델병합 및 수정",
"feature": "모델의 정합성 확인 및 편집\n기본기능 및 Grasshopper 사용",
"note": "Way 파일 내 도로 형상 모델 추출 시WayExport3DAppo를 사용하여 obj 모델 생성\n그 외의 구조물을 각 프로그램에서 obj 불러오기"
},
{
"id": "program-1782180934346-2",
"title": "속성정보",
"feature": "속성정보 입력\n현재 Plugin에 도로정보만 자동으로 입력",
"note": "Plugin 설치하여 객체별 WBS 정보 입력"
},
{
"id": "program-1782180934346-3",
"title": "3단계",
"feature": "wpbifc 포맷으로 저장",
"note": "설치된 Plugin에서 wbpifc 포맷으로 저장"
},
{
"id": "program-1782180934346-4",
"title": "중립포맷 생성",
"feature": "ifc파일 생성",
"note": "DataChange 프로그램 사용으로 ifc 파일 추출"
}
],
"format": "obj, wbpifc, ifc",
"deliverables": [
"3D 모델"
],
"linkLabel": "생성 모델 확인 및 변경",
"detailGates": [
{
"key": "gate2-1782192916845",
"targetProgramId": "wayPrimal",
"stepId": "wp-1",
"question": "도로 모델 변경?",
"yes": "Way 재실행",
"no": "아니오: 변경사항 없음"
},
{
"key": "gate1",
"targetProgramId": "program-1782191391645",
"stepId": "program-1782191391645-1",
"question": "교량 구조물 모델 상세 치수 변경?",
"yes": "BridgeModeler 재실행",
"no": "아니오: 다음 검토"
},
{
"key": "gate3-1782194421761",
"targetProgramId": "program-1782180934346",
"stepId": "program-1782180934346-3",
"question": "Wall 구조물 모델 상세 치수 변경?",
"yes": "예: 3단계 재진입",
"no": "아니오: 변경사항 없음"
}
],
"linkSourceId": "wayPrimal",
"linkSourceIds": [
"wayPrimal",
"cheonjiin"
],
"predecessors": [
"program-1782191391645",
"program-1782194494893",
"cheonjiin",
"wayPrimal",
"program-1782201626309"
],
"successors": []
}
]
}

2213
src/App.jsx Normal file

File diff suppressed because it is too large Load Diff

9
src/main.jsx Normal file
View File

@@ -0,0 +1,9 @@
import React from 'react';
import { createRoot } from 'react-dom/client';
import App from './App.jsx';
createRoot(document.getElementById('root')).render(
<React.StrictMode>
<App />
</React.StrictMode>
);

90
vite.config.js Normal file
View File

@@ -0,0 +1,90 @@
import fs from 'node:fs/promises';
import path from 'node:path';
import { defineConfig } from 'vite';
import react from '@vitejs/plugin-react';
const databasePath = path.resolve(process.cwd(), 'data', 'flow-db.json');
async function readDatabase() {
try {
const raw = await fs.readFile(databasePath, 'utf8');
return JSON.parse(raw);
} catch (error) {
if (error.code === 'ENOENT') return null;
throw error;
}
}
async function writeDatabase(data) {
await fs.mkdir(path.dirname(databasePath), { recursive: true });
await fs.writeFile(databasePath, JSON.stringify({
...data,
updatedAt: new Date().toISOString()
}, null, 2));
}
function readRequestBody(request) {
return new Promise((resolve, reject) => {
let body = '';
request.on('data', (chunk) => {
body += chunk;
if (body.length > 5_000_000) {
reject(new Error('Request body is too large'));
request.destroy();
}
});
request.on('end', () => resolve(body));
request.on('error', reject);
});
}
function sendJson(response, statusCode, payload) {
response.statusCode = statusCode;
response.setHeader('Content-Type', 'application/json; charset=utf-8');
response.end(JSON.stringify(payload));
}
function serverDatabasePlugin() {
return {
name: 'flow-server-database',
configureServer(server) {
server.middlewares.use('/api/state', async (request, response) => {
try {
if (request.method === 'GET') {
const data = await readDatabase();
if (!data) {
sendJson(response, 404, { error: 'Database is empty' });
return;
}
sendJson(response, 200, data);
return;
}
if (request.method === 'PUT' || request.method === 'PATCH') {
const current = request.method === 'PATCH' ? (await readDatabase()) ?? {} : {};
const body = await readRequestBody(request);
const payload = body ? JSON.parse(body) : {};
const nextData = {
...current,
...payload
};
await writeDatabase(nextData);
sendJson(response, 200, nextData);
return;
}
response.statusCode = 405;
response.end();
} catch (error) {
sendJson(response, 500, { error: error.message });
}
});
}
};
}
export default defineConfig({
plugins: [react(), serverDatabasePlugin()]
});