From efb5d0cd735aece4e8875a5ac2a032f5dce4cb29 Mon Sep 17 00:00:00 2001 From: Hyein Date: Thu, 25 Jun 2026 08:41:33 +0900 Subject: [PATCH] Fix UTF-8 request body handling --- data/flow-db.json | 202 ++++++++++++++++++++++++++++++++++++++++++---- data/flow.db | Bin 16384 -> 32768 bytes vite.config.js | 10 ++- 3 files changed, 194 insertions(+), 18 deletions(-) diff --git a/data/flow-db.json b/data/flow-db.json index 35f94ef..cccef3e 100644 --- a/data/flow-db.json +++ b/data/flow-db.json @@ -37,11 +37,14 @@ "지형,지층 보정 모델" ], "format": "glb", + "programType": "internal", "predecessors": [], "successors": [ "wayPrimal", - "program-1782180934346" + "program-1782180934346", + "program-1782264403218" ], + "mergeGroup": "", "detailGates": [ { "key": "gate1", @@ -88,7 +91,7 @@ }, { "title": "노폭계획", - "feature": "선형계획, 노즈, 편경사,\n구조물, 시설계획 입력", + "feature": "선형계획, 노즈, 편경사, 구조물,\n시설계획 입력", "note": "노선의 폭, 선형, 구조물 조건 입력" }, { @@ -106,13 +109,17 @@ "deliverables": [ "평면도, 횡단면도, 종평면도, 기본설계모델" ], + "programType": "internal", "predecessors": [ "cheonjiin" ], "successors": [ "program-1782180934346", - "program-1782201626309" + "program-1782201626309", + "program-1782264403218", + "program-1782264979690" ], + "mergeGroup": "", "linkLabel": "천지인 결과물을 WayPrimal로 연계", "linkSourceIds": [ "cheonjiin" @@ -166,6 +173,42 @@ } ] }, + "comparisons": [ + { + "id": "comparison-program-1782180934346__program-1782264403218", + "title": "", + "leftProgramId": "program-1782264403218", + "rightProgramId": "program-1782180934346", + "stepMatches": [ + { + "id": "step-0", + "leftStepIndex": "0", + "rightStepIndex": "0", + "reason": "현재 Visual Script 기능인 [redbold]GrassHopper[/redbold]로 작성하여 작업하는 단계들은 EG-BIM Modeler에서 구현 불가능함" + }, + { + "id": "step-1", + "leftStepIndex": "1", + "rightStepIndex": "1", + "reason": "사내에서 개발한 [redbold]Plugin[/redbold]으로 Rhino에서 도로에 대한 속성정보(WBS)는 선택하여 입력 가능하며, 그 외는 사용자가 직접 입력해야함\nEG-BIM Modeler에서도 사용자가 직접 입력하는 기능은 있음" + }, + { + "id": "step-2", + "leftStepIndex": "2", + "rightStepIndex": "2", + "reason": "위의 Plugin에는 [redbold]wpbifc로 저장하는 기능[/redbold]도 있어서 wpbifc로 저장하지만 EG-BIM Modeler에서는 obj와 hmeg 저장 지원" + }, + { + "id": "step-3", + "leftStepIndex": "3", + "rightStepIndex": "3", + "reason": "PJT 제출 파일은 작업원본과 ifc 파일\n위의 2,3단계에서 변환포맷(wpbifc)을\n사내에서 개발한 [redbold]DataChange[/redbold] 프로그램으로\n ifc로 변환하여 제출 가능\nEG-BIM Modeler는 변환포맷(wpbifc)\n지원하지 않음" + } + ], + "note": "EG-BIM Modeler은 모델병합 및 수정, 속성정보, 변환포맷, 중립포맷 생성에서 기능 구현 또는 자동화 범위에 한계가 있어 Rhino의 기능 보완이 필요합니다.\n\n주요 사유\n- 현재 Visual Script 기능인 [redbold]GrassHopper[/redbold]로 작업하는 단계들은 EG-BIM Modeler에서 구현 불가능함\n- 사내에서 개발한 [redbold]Plugin[/redbold]으로 Rhino에서 도로에 대한 속성정보(WBS)는 선택하여 입력 가능하며, 그 외는 사용자가 직접 입력해야함\n (EG-BIM Modeler에서도 사용자가 직접 입력하는 기능은 있음)\n- 위의 Plugin에는 [redbold]wpbifc[/redbold]로 저장하는 기능도 있음 (EG-BIM Modeler에서는 obj와 hmeg 저장만 지원)\n\n따라서 현재 업무 흐름에서는 해당 구간을 Rhino으로 연계하여 결과 품질과 작업 연속성을 확보하는 것이 적절합니다.", + "updatedAt": "2026-06-24T05:30:17.265Z" + } + ], "extraPrograms": [ { "id": "program-1782201626309", @@ -189,9 +232,13 @@ "successors": [ "program-1782180934346", "program-1782191391645", - "program-1782194494893" + "program-1782194494893", + "program-1782264403218", + "program-1782264979690" ], - "linkLabel": "이전 프로그램 산출물을 새 프로그램 입력으로 연계" + "linkLabel": "이전 프로그램 산출물을 새 프로그램 입력으로 연계", + "programType": "internal", + "mergeGroup": "" }, { "id": "program-1782194494893", @@ -262,8 +309,11 @@ "program-1782201626309" ], "successors": [ - "program-1782180934346" - ] + "program-1782180934346", + "program-1782264403218" + ], + "programType": "internal", + "mergeGroup": "" }, { "id": "program-1782191391645", @@ -291,7 +341,7 @@ { "id": "program-1782191391645-4", "title": "교각", - "feature": "교좌면, 코핑, 기둥, 기초 형식 및 상세치수 입력", + "feature": "교좌면, 코핑, 기둥, 기초 형상 및 상세치수 입력", "note": "교대 변수 입력\n(전환BIM - 도면 치수 입력)" } ], @@ -341,8 +391,90 @@ "program-1782201626309" ], "successors": [ - "program-1782180934346" - ] + "program-1782180934346", + "program-1782264403218" + ], + "programType": "internal", + "mergeGroup": "" + }, + { + "id": "program-1782264979690", + "name": "WayDraw", + "description": "새 프로그램 업무 플로우", + "steps": [ + { + "id": "program-1782264979690-1", + "title": "1단계", + "feature": "주요 기능 입력", + "note": "단계 설명을 입력합니다." + }, + { + "id": "program-1782264979690-2", + "title": "2단계", + "feature": "주요 기능 입력", + "note": "단계 설명을 입력합니다." + } + ], + "format": "", + "deliverables": [ + "grm, dwg, dfx" + ], + "programType": "internal", + "predecessors": [ + "program-1782201626309", + "wayPrimal" + ], + "successors": [ + "program-1782264980554" + ], + "linkLabel": "이전 프로그램 산출물을 새 프로그램 입력으로 연계", + "mergeGroup": "" + }, + { + "id": "program-1782264403218", + "name": "EG-BIM Modeler", + "description": "새 프로그램 업무 플로우", + "steps": [ + { + "id": "program-1782264403218-1", + "title": "모델병합 및 수정", + "feature": "기본기능만 가능", + "note": "" + }, + { + "id": "program-1782264403218-2", + "title": "속성정보", + "feature": "탬플릿만 불러오기 가능하며, 사용자가 입력해야함", + "note": "" + }, + { + "id": "program-1782264403218-1782264427883-3", + "title": "변환포맷", + "feature": "obj, hmeg로만 저장 가능", + "note": "" + }, + { + "id": "program-1782264403218-1782264428058-4", + "title": "중립포맷 생성", + "feature": "기능 없음", + "note": "" + } + ], + "format": "", + "deliverables": [ + "성과물" + ], + "programType": "internal", + "predecessors": [ + "cheonjiin", + "program-1782201626309", + "program-1782191391645", + "wayPrimal", + "program-1782194494893" + ], + "successors": [], + "linkLabel": "이전 프로그램 산출물을 새 프로그램 입력으로 연계", + "mergeGroup": "program-1782264403218" }, { "id": "program-1782180934346", @@ -353,7 +485,7 @@ "id": "program-1782180934346-1", "title": "모델병합 및 수정", "feature": "모델의 정합성 확인 및 편집\n기본기능 및 Grasshopper 사용", - "note": "Way 파일 내 도로 형상 모델 추출 시WayExport3DAppo를 사용하여 obj 모델 생성\n그 외의 구조물을 각 프로그램에서 obj 불러오기" + "note": "Way 파일에서 형상 모델 추출 시WayExport3DAppo를 사용하여 obj 모델 생성\n그 외의 구조물 각 프로그램에서 obj 불러오기" }, { "id": "program-1782180934346-2", @@ -363,7 +495,7 @@ }, { "id": "program-1782180934346-3", - "title": "3단계", + "title": "변환포맷", "feature": "wpbifc 포맷으로 저장", "note": "설치된 Plugin에서 wbpifc 포맷으로 저장" }, @@ -417,10 +549,52 @@ "wayPrimal", "program-1782201626309" ], - "successors": [] + "successors": [], + "programType": "commercial", + "mergeGroup": "program-1782264403218" + }, + { + "id": "program-1782264980554", + "name": "EG-BIM Drawer", + "description": "새 프로그램 업무 플로우", + "steps": [ + { + "id": "program-1782264980554-1", + "title": "1단계", + "feature": "주요 기능 입력", + "note": "단계 설명을 입력합니다." + }, + { + "id": "program-1782264980554-2", + "title": "2단계", + "feature": "주요 기능 입력", + "note": "단계 설명을 입력합니다." + } + ], + "format": "", + "deliverables": [ + "" + ], + "programType": "internal", + "predecessors": [ + "program-1782264979690" + ], + "successors": [], + "linkLabel": "이전 프로그램 산출물을 새 프로그램 입력으로 연계", + "mergeGroup": "", + "detailGates": [ + { + "key": "gate1", + "targetProgramId": "program-1782264980554", + "stepId": "program-1782264980554-1", + "question": "변경?", + "yes": "예: 계 재진입", + "no": "아니오: 변경사항 없음" + } + ] } ] }, "programStates": {}, - "updatedAt": "2026-06-23T08:50:22.594Z" + "updatedAt": "2026-06-24T23:37:33.312Z" } \ No newline at end of file diff --git a/data/flow.db b/data/flow.db index 2c512b7a3bb1670d624402c441edc28062eb7cc2..2ab3067a4892f64f27cff2f4b42a0e1dd861f20d 100644 GIT binary patch literal 32768 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

i`#xMo9O3|u2pcz7ab0d|Kb#8El@LpC^ZWS zk{XM{R@5Bo6_Nq;gh;}zvhwDj6{XjwSuojx#2d!%po?B5+Y^~q(-z8kI!RQJ++g>R z>2P#TkS=u2uRXj8tI!3aSb#K#%yr6Kl1xGP9tCttCi?xoU2u3x6Bc}ovKqdt>_T$( zBr7YY$7%n|Lm1p2fi$gQ^1(LReAs#LUto{58pqAV9;MC?F$K~X)-5P0de@MzrE_Oa z&*14K_!Mo2cm_D`b2{0ExS5+YUe4UToP{GYc2bHTuz@m+W}kX+f6oiqC>(QxEOxdr z-pPaCy?x zWtcH}K=)tB%-M<7HFnle9f;dXo;oA`|30Wyb{rJatY0)~%8F)8iic^!E~Isc#i?siJce z#Gp#Q?zJ?i*Hv8TyY3aNUq|1tT&(i6;I7j39y2msPYo&`#uCYD%@17NrPei=YRz>) zMg%@;XrWtJ(Q@tBd)3N9n95TZvgcm+yQnUk_tz=m&XrSmw}o#+Ci2t+8Ru_6yM^Z6>Sjgu*Jij7oL=hHe+ zb6j_z#yXi@@|AK{1I?e`XyXXu<)5X09yu&QTg33k$MI7+7|kT9XoYML#G z;d`3Mn|lWt{l`**7+w$TofzhofZ8C27YU3YhIdi50=p>#5ybF(kb!E-zI;*;!v`^Z zg;E4Dyi6U7Y?xw9=uHTf8N(ok4`TQleU3p4?|b7<5W`dNbr8c7SoH)^KZd6)8OQ$g z${Q5cksF`{sJJEy2sNAX5cB`!W$yo>o*jVrkO7jfbKu;rILYTW<#;uw9dbRvd4VD4 z@Ps&*?R>&fitp&W0NO})_qc+S0!}6|I4PjNVouN4z4<2v2G7OFhxF?N*V*+#z2@OfXF#$dZ z7aS9KqmBt6{%=6lT6FYMM@7x|^f^tZYPjs4iO`V8_wjy-;5C8#T5q@OOYh`^4|}zp zUrtZF*5Fg4l~jkI+y@|g`;ep(=_w46DZlD*zT0c1>6zN0sx1<{Ca_9_t|lSbW9z=^ z)Rn%9`f!K;WGH%r#5-X3^gb8wwL*Gpop*>`zpl38d0l<}F-|9&zuOO=Uq{=WmYMe% zL3u!=di$7jtb~+Yyu*{*N?E$WYXXDU1d9JDj3_FT2S!(((`6jICNOwSpx#^P3rDF@ znof?06Sbn^;~h&xTOFEvdzfAS^H!TbN{|DLobyr^oF8)DK7!TbN%p1+Fs|3xDEBcbqze*z0?vrPa1 delta 265 zcmZo@U}|V!oFK)=AjiPKzyiczFj2#di9v2-!cu-#mUIS|^o@nFEF9Ol7}*&b*TzrQ z6Ofy{LqKdZmtZZ+ { - let body = ''; + const chunks = []; + let bodyLength = 0; request.on('data', (chunk) => { - body += chunk; - if (body.length > 5_000_000) { + chunks.push(chunk); + bodyLength += chunk.length; + if (bodyLength > 5_000_000) { reject(new Error('Request body is too large')); request.destroy(); } }); - request.on('end', () => resolve(body)); + request.on('end', () => resolve(Buffer.concat(chunks).toString('utf8'))); request.on('error', reject); }); }