@dssp/supervision 1.0.23 → 1.0.25

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"building-inspection-detail-ai-measurement.js","sourceRoot":"","sources":["../../../client/pages/building-inspection/building-inspection-detail-ai-measurement.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * 검측 관리 상세 - AI 자동 검측 (동영상 세트 + 측정 모델 2종)\n *\n * 체크리스트 항목을 AI 엔진(inspection-ai)과 측정 서버(measure-engine)에 연동해:\n * 1) 촬영 가이드(plan-shots, 동영상 최대 3건)를 표시하고\n * 2) LidarInspector 앱이 만든 세트(video.mov/poses.jsonl/meta.json)를 업로드하면\n * 3) 세트별 대표 3프레임으로 자동 판정(inspect, input_kind=video_frames)을 실행한 뒤\n * 4) 「추가 작업 필요」(재촬영/기준값 입력/AI 미지원)를 분류해 측정 UI(철근 배근 길이·기둥벽체 두께)로 처리하고\n * 5) 측정 결과는 apply-measurement로 판정 확정 → 검사 등록 시 감리자 적합/부적합 자동 반영 + 근거 첨부한다.\n */\nimport '@material/web/icon/icon.js'\nimport '@material/web/progress/circular-progress.js'\n\nimport gql from 'graphql-tag'\nimport { css, html } from 'lit'\nimport { customElement, state, query } from 'lit/decorators.js'\n\nimport { PageView, navigate } from '@operato/shell'\nimport { ScrollbarStyles } from '@operato/styles'\nimport { PageLifecycle } from '@operato/shell/dist/src/app/pages/page-view'\nimport { client } from '@operato/graphql'\nimport { notify } from '@operato/layout'\nimport { canDcspMutate } from '@dssp/building-complex/dist-client/utils/privilege'\n\nimport './component/building-inspection-detail-header'\n\nconst ENGINE_BASE_URL = 'https://hatiolab-korea-uni.nruing.com'\nconst ENGINE_RUN_URL = `${ENGINE_BASE_URL}/api/run/inspection-ai`\nconst ENGINE_AUTH = `Basic ${btoa('admin:admin1234')}`\n/* 측정 서버(measure-engine/server.py). 배포 시 실제 주소로 수정 — https 페이지에서는 https(리버스 프록시) 필요 */\nconst MEASURE_BASE_URL = 'https://hatiolab-korea-uni.nruing.com/measure'\nconst MEASURE_AUTH = ENGINE_AUTH\n\n/* 촬영 안내 이미지 (엔진 전달물 고정 그림 + 픽토그램) */\nconst captureGuideImg = new URL('../../assets/ai-measurement/capture_guide.png', import.meta.url).href\nconst pictoRebarImg = new URL('../../assets/ai-measurement/picto-rebar-parallel.svg', import.meta.url).href\nconst pictoMemberImg = new URL('../../assets/ai-measurement/picto-member-corner.svg', import.meta.url).href\n\n/* 세트 폴더 필수 파일 (LidarInspector 앱이 촬영 1회당 생성) */\nconst SET_FILES = ['video.mov', 'poses.jsonl', 'meta.json']\n\n/* 촬영 앱 실행 링크 — iPad에서 이 화면을 열었을 때 앱이 바로 촬영 화면으로 뜬다.\n server 파라미터로 업로드 주소까지 넘겨서 앱 설정을 따로 안 만져도 되게 한다.\n return 파라미터를 주면 앱이 업로드를 마친 뒤 이 화면으로 돌아온다(?set_id=... 가 붙어서 온다). */\nfunction appCaptureLink(tech: 'cover' | 'thick') {\n return (\n `gamri://${tech}?server=${encodeURIComponent(MEASURE_BASE_URL)}` +\n `&return=${encodeURIComponent(location.href)}`\n )\n}\n\n/* 한 번의 /inspect 에 보낼 검사항목 수. 엔진이 8개까지만 병렬 처리하고, 그 앞단\n Cloudflare 가 100초에서 끊기 때문에(524) 항목이 많으면 나눠 보내야 한다. */\nconst INSPECT_BATCH = 8\n\n/* 나눠 호출한 /inspect 결과 합치기 — 항목 배열만 이어 붙이고 요약은 다시 센다 */\nfunction _mergeInspectResults(a: any, b: any) {\n const items = [...(a.items || []), ...(b.items || [])]\n const itemsSorted =\n a.items_sorted || b.items_sorted ? [...(a.items_sorted || a.items || []), ...(b.items_sorted || b.items || [])] : undefined\n\n const summary: Record<string, number> = { pass: 0, fail: 0, hold: 0, pending: 0, error: 0, measure: 0 }\n for (const it of items) {\n summary[it.verdict] = (summary[it.verdict] || 0) + 1\n if (it.verdict === 'pending' && it.pending_reason === 'measure') summary.measure += 1\n }\n summary.total = items.length\n\n return { ...a, ...b, items, ...(itemsSorted ? { items_sorted: itemsSorted } : {}), summary }\n}\n\n/* KCS 기준은 매칭 결과 JSON(kcs_matches[0])으로 저장돼 있다 → 엔진에 보낼 조문 텍스트로 편다.\n 문서/조항 라벨을 앞에 붙여야 모델이 어느 기준을 인용하는지 reason 에 쓸 수 있다. */\nfunction _kcsCriteriaText(raw?: string) {\n if (!raw) return ''\n try {\n const kcs = JSON.parse(raw)\n const label = [kcs.file_label, kcs.clause_no, kcs.clause_title].filter(Boolean).join(' ')\n const body = (kcs.matched_item || kcs.text || '').trim()\n return body ? `${label}\\n${body}`.trim() : label\n } catch {\n return raw.trim() // 구형 데이터(문자열 그대로 저장된 경우)\n }\n}\n\n/* set_id(YYYYmmdd-HHMMSS_xxxxxx) → \"9/11 14:30\" 표기 */\nfunction _setTimeLabel(setId: string) {\n const m = /^(\\d{4})(\\d{2})(\\d{2})-(\\d{2})(\\d{2})/.exec(setId || '')\n return m ? `${Number(m[2])}/${Number(m[3])} ${m[4]}:${m[5]}` : setId\n}\n\n/* 엔진 verdict(기계값) → 화면 라벨. pass/fail만 합/불로 자동 체크, 나머지는 감리자 판단 */\nconst VERDICT_LABEL = {\n pass: '적합',\n fail: '부적합',\n hold: '재촬영 필요',\n pending: 'AI 미지원',\n error: '분석 오류'\n}\n\n/* 엔진 routing(기계값) → 화면 라벨. cv 계열은 CV팀 명세 고정 문구 \"3D 계측\" */\nconst ROUTING_LABEL = {\n vlm: 'AI 사진판독',\n cv: '3D 계측',\n cv_missing: '3D 계측'\n}\n\n/* operator_inputs 필드 키 → 한글 라벨 (모르는 키는 키 그대로 노출) */\nconst FIELD_LABEL = {\n name: '부재/변 이름',\n member_dim_mm: '설계 단면 치수 (mm)',\n cover_spec_mm: '기준(최소) 피복두께 (mm)',\n design_mm: '설계 두께 (mm)',\n tol_mm: '허용 공차 ± (mm)'\n}\n\ntype PanelMode = 'none' | 'detail' | 'recapture' | 'measure' | 'report'\n\ntype SetInfo = {\n setId: string\n technique?: string\n label: string\n warnings: string[]\n}\n\n@customElement('building-inspection-detail-ai-measurement')\nexport class BuildingInspectionAiMeasurement extends PageView {\n static styles = [\n ScrollbarStyles,\n css`\n :host {\n display: grid;\n grid-template-rows: 75px 1fr;\n color: #4e5055;\n width: 100%;\n height: 100%;\n background-color: #f7f7f7;\n }\n\n * {\n box-sizing: border-box;\n }\n\n div[body] {\n display: flex;\n flex-direction: column;\n min-height: 0;\n overflow-y: auto;\n padding: var(--spacing-medium);\n gap: 12px;\n }\n\n .page-title {\n text-align: center;\n font-size: 16px;\n font-weight: 700;\n color: #333;\n }\n\n .page-title span[target] {\n color: #7d2f2f;\n text-decoration: underline;\n }\n\n /* ─── 1단계: 촬영 가이드 ─── */\n .guide-container {\n max-width: 560px;\n width: 100%;\n margin: 0 auto;\n display: flex;\n flex-direction: column;\n gap: 14px;\n }\n\n .step-badge {\n align-self: flex-start;\n background: #f7e9e9;\n color: #7d2f2f;\n font-size: 12px;\n font-weight: 700;\n padding: 4px 10px;\n border-radius: 12px;\n }\n\n .guide-title {\n font-size: 26px;\n font-weight: 800;\n color: #222;\n line-height: 1.3;\n white-space: pre-line;\n }\n\n .guide-desc {\n font-size: 13px;\n color: #777;\n }\n\n .card {\n background: #fff;\n border: 1px solid #e5e5e5;\n border-radius: 10px;\n padding: 16px;\n }\n\n .card h4 {\n margin: 0 0 10px 0;\n font-size: 14px;\n color: #333;\n }\n\n .card ul {\n margin: 0;\n padding-left: 4px;\n list-style: none;\n display: flex;\n flex-direction: column;\n gap: 8px;\n }\n\n .card ul li {\n font-size: 13px;\n color: #555;\n display: flex;\n gap: 8px;\n }\n\n .card ul li::before {\n content: '';\n flex-shrink: 0;\n width: 6px;\n height: 6px;\n border-radius: 50%;\n background: #7d2f2f;\n margin-top: 6px;\n }\n\n /* 촬영 안내 그림 — 픽토그램은 배경 투명·짙은 글자라 밝은 카드 위에만 얹는다 */\n .capture-guide-img {\n width: 100%;\n border-radius: 8px;\n display: block;\n }\n\n /* 촬영 앱 실행 링크 */\n .app-links {\n display: flex;\n align-items: center;\n gap: 8px;\n flex-wrap: wrap;\n font-size: 12px;\n color: #777;\n }\n\n /* 촬영 칸의 「앱으로 촬영」 */\n .shoot-link {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n flex-shrink: 0;\n padding: 7px 12px;\n border-radius: 999px;\n background: #7d2f2f;\n color: #fff;\n font-size: 12px;\n font-weight: 600;\n text-decoration: none;\n }\n\n .shoot-link md-icon {\n --md-icon-size: 16px;\n color: #fff;\n }\n\n .app-links a {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 6px 12px;\n border: 1px solid #7d2f2f;\n border-radius: 999px;\n color: #7d2f2f;\n font-size: 12px;\n font-weight: 600;\n text-decoration: none;\n }\n\n /* 앱이 올린 세트 고르기 */\n .set-chooser {\n border: 1px solid #e5e5e5;\n border-radius: 8px;\n background: #fff;\n margin: -4px 0 4px 38px;\n padding: 6px;\n max-height: 220px;\n overflow-y: auto;\n }\n\n .chooser-row {\n display: block;\n width: 100%;\n text-align: left;\n border: 0;\n background: transparent;\n border-radius: 6px;\n padding: 8px 10px;\n cursor: pointer;\n font-size: 12px;\n color: #666;\n }\n\n .chooser-row:hover {\n background: #f5f5f5;\n }\n\n .chooser-row b {\n display: block;\n font-size: 13px;\n color: #333;\n }\n\n .chooser-empty {\n padding: 12px 10px;\n font-size: 12px;\n color: #999;\n }\n\n .chooser-actions {\n display: flex;\n justify-content: flex-end;\n gap: 4px;\n border-top: 1px solid #f0f0f0;\n padding-top: 4px;\n }\n\n .set-chooser .app-links {\n border-top: 1px solid #f0f0f0;\n padding: 8px 4px 6px;\n }\n\n /* 세트 업로드 카드 */\n .set-card {\n display: flex;\n align-items: center;\n gap: 10px;\n border: 1px dashed #ccc;\n border-radius: 8px;\n background: #fafafa;\n padding: 12px;\n cursor: pointer;\n }\n\n .set-card[uploaded] {\n border-style: solid;\n border-color: #bfd8bf;\n background: #f2f8f2;\n cursor: default;\n }\n\n .set-card md-icon {\n --md-icon-size: 28px;\n color: #b5b5b5;\n flex-shrink: 0;\n }\n\n .set-card[uploaded] md-icon {\n color: #2e7d32;\n }\n\n .set-card .set-main {\n flex: 1;\n min-width: 0;\n font-size: 13px;\n color: #555;\n }\n\n .set-card .set-main b {\n display: block;\n color: #333;\n margin-bottom: 2px;\n }\n\n .set-card .set-warn {\n font-size: 11px;\n color: #b7791f;\n }\n\n .progress-row {\n display: flex;\n justify-content: space-between;\n align-items: center;\n font-size: 13px;\n color: #555;\n font-weight: 600;\n }\n\n .progress-bar {\n height: 6px;\n border-radius: 3px;\n background: #eee;\n overflow: hidden;\n }\n\n .progress-bar div {\n height: 100%;\n background: #7d2f2f;\n transition: width 0.3s;\n }\n\n .primary-button {\n width: 100%;\n border: none;\n border-radius: 8px;\n background: #7d2f2f;\n color: #fff;\n font-size: 16px;\n font-weight: 700;\n padding: 14px;\n cursor: pointer;\n }\n\n .primary-button:disabled {\n background: #ccc;\n cursor: default;\n }\n\n .text-button {\n border: 1px solid #ddd;\n border-radius: 8px;\n background: #fff;\n color: #555;\n font-size: 13px;\n padding: 8px 14px;\n cursor: pointer;\n }\n\n input[type='file'] {\n display: none;\n }\n\n /* ─── 2단계: 판정 결과 ─── */\n /* 결과 화면은 높이를 화면에 고정하고 컬럼(프레임/판정 리스트/상세)별로 내부 스크롤 */\n .result-body {\n display: flex;\n gap: 14px;\n flex: 1;\n min-height: 0;\n }\n\n .photo-pane {\n flex: 1.1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n gap: 8px;\n }\n\n .photo-pane .caption {\n text-align: center;\n font-size: 12px;\n color: #999;\n }\n\n .photo-main {\n border-radius: 10px;\n overflow: hidden;\n background: #000;\n display: flex;\n justify-content: center;\n max-height: 480px;\n }\n\n .photo-main img {\n max-width: 100%;\n max-height: 480px;\n object-fit: contain;\n }\n\n .photo-thumbs {\n display: flex;\n gap: 8px;\n overflow-x: auto;\n padding-bottom: 4px;\n }\n\n .photo-thumbs img {\n width: 96px;\n height: 72px;\n object-fit: cover;\n border-radius: 6px;\n cursor: pointer;\n border: 2px solid transparent;\n }\n\n .photo-thumbs img[selected] {\n border-color: #7d2f2f;\n }\n\n .items-pane {\n flex: 1.4;\n min-width: 0;\n display: flex;\n flex-direction: column;\n gap: 10px;\n overflow-y: auto;\n padding-right: 4px;\n }\n\n .photo-pane,\n .side-pane {\n overflow-y: auto;\n }\n\n .summary-banner {\n background: #f7e9e9;\n border: 1px solid #eedada;\n color: #7d2f2f;\n font-size: 13px;\n font-weight: 700;\n border-radius: 8px;\n padding: 10px 14px;\n }\n\n .group-title {\n font-size: 14px;\n font-weight: 700;\n color: #333;\n margin-top: 4px;\n }\n\n .group-subtitle {\n font-size: 12px;\n font-weight: 700;\n color: #777;\n margin: 2px 0 0 4px;\n }\n\n .item-card {\n display: flex;\n gap: 10px;\n align-items: flex-start;\n background: #fff;\n border: 1px solid #e5e5e5;\n border-radius: 10px;\n padding: 12px;\n cursor: pointer;\n }\n\n .item-card[selected] {\n border-color: #7d2f2f;\n box-shadow: 0 0 0 1px #7d2f2f inset;\n }\n\n .item-no {\n flex-shrink: 0;\n width: 24px;\n height: 24px;\n border-radius: 50%;\n background: #7d2f2f;\n color: #fff;\n font-size: 12px;\n font-weight: 700;\n display: flex;\n justify-content: center;\n align-items: center;\n }\n\n .item-main {\n flex: 1;\n min-width: 0;\n }\n\n .item-name {\n font-size: 14px;\n font-weight: 700;\n color: #222;\n margin-bottom: 4px;\n }\n\n .item-desc {\n font-size: 12px;\n color: #777;\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n }\n\n .chip {\n display: inline-block;\n font-size: 11px;\n font-weight: 700;\n border-radius: 4px;\n padding: 2px 6px;\n margin-right: 6px;\n background: #eef2f7;\n color: #3f71a0;\n }\n\n .chip-verdict {\n font-size: 12px;\n font-weight: 700;\n color: #555;\n }\n\n .badge {\n flex-shrink: 0;\n font-size: 12px;\n font-weight: 700;\n border-radius: 14px;\n padding: 5px 12px;\n white-space: nowrap;\n }\n\n .badge[pass] {\n background: #e8f5e9;\n color: #2e7d32;\n }\n\n .badge[fail] {\n background: #fdecea;\n color: #c62828;\n }\n\n .badge[etc] {\n background: #fff8e1;\n color: #b7791f;\n }\n\n .capture-button {\n flex-shrink: 0;\n border: none;\n border-radius: 14px;\n background: #fff3e0;\n color: #b7791f;\n font-size: 12px;\n font-weight: 700;\n padding: 6px 12px;\n cursor: pointer;\n }\n\n .measure-button {\n flex-shrink: 0;\n border: none;\n border-radius: 14px;\n background: #e8eef7;\n color: #2f5d8a;\n font-size: 12px;\n font-weight: 700;\n padding: 6px 12px;\n cursor: pointer;\n }\n\n /* ─── 우측 패널 (상세/재촬영/측정/리포트) ─── */\n .side-pane {\n flex: 1;\n min-width: 300px;\n max-width: 400px;\n background: #fff;\n border: 1px solid #e5e5e5;\n border-radius: 10px;\n padding: 16px;\n display: flex;\n flex-direction: column;\n gap: 12px;\n }\n\n .side-pane h3 {\n margin: 0;\n font-size: 16px;\n color: #222;\n }\n\n .detail-header {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .detail-header h3 {\n font-size: 18px;\n }\n\n .detail-summary {\n font-size: 12px;\n color: #555;\n line-height: 1.7;\n white-space: pre-line;\n border-bottom: 1px solid #f0f0f0;\n padding-bottom: 10px;\n }\n\n .kv-grid {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 10px;\n }\n\n .kv {\n display: flex;\n flex-direction: column;\n gap: 2px;\n border: 1px solid #eee;\n border-radius: 8px;\n padding: 10px 12px;\n background: #fff;\n }\n\n .kv label {\n font-size: 11px;\n color: #999;\n }\n\n .kv span {\n font-size: 15px;\n font-weight: 700;\n color: #333;\n }\n\n .kv .verdict-value[pass] {\n color: #2e7d32;\n }\n\n .kv .verdict-value[fail] {\n color: #c62828;\n }\n\n .reason-box {\n display: flex;\n flex-direction: column;\n gap: 10px;\n font-size: 12px;\n line-height: 1.7;\n }\n\n .reason-verdict {\n border-left: 3px solid #7d2f2f;\n background: #fdf6f6;\n color: #333;\n padding: 8px 10px;\n }\n\n .evidence-img {\n width: 100%;\n border-radius: 8px;\n border: 1px solid #eee;\n }\n\n .why-box {\n background: #fff8e1;\n border: 1px solid #f4e4b5;\n border-radius: 8px;\n padding: 10px;\n font-size: 12px;\n color: #7a5c14;\n line-height: 1.6;\n }\n\n /* 측정 패널 */\n .measure-field {\n display: flex;\n flex-direction: column;\n gap: 4px;\n font-size: 12px;\n color: #555;\n }\n\n .measure-field input,\n .measure-field select {\n padding: 9px 10px;\n border: 1px solid #ccc;\n border-radius: 6px;\n font-size: 14px;\n }\n\n .measure-msg {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 13px;\n color: #7d2f2f;\n font-weight: 600;\n }\n\n .measure-msg md-circular-progress {\n --md-circular-progress-size: 22px;\n }\n\n .frame-strip {\n display: flex;\n gap: 6px;\n overflow-x: auto;\n padding-bottom: 4px;\n }\n\n .frame-strip img {\n height: 60px;\n border-radius: 6px;\n border: 2px solid transparent;\n cursor: pointer;\n opacity: 0.7;\n }\n\n .frame-strip img[selected] {\n border-color: #7d2f2f;\n opacity: 1;\n }\n\n .click-stage {\n position: relative;\n line-height: 0;\n }\n\n .click-stage img {\n width: 100%;\n border-radius: 8px;\n cursor: crosshair;\n }\n\n .click-dot {\n position: absolute;\n width: 24px;\n height: 24px;\n margin: -12px 0 0 -12px;\n border: 3px solid #ffd400;\n border-radius: 50%;\n pointer-events: none;\n }\n\n .measure-summary {\n background: #f7f7f7;\n border-radius: 8px;\n padding: 10px;\n font-size: 12px;\n color: #333;\n line-height: 1.7;\n white-space: pre-line;\n }\n\n .report-counts {\n display: flex;\n text-align: center;\n border: 1px solid #eee;\n border-radius: 8px;\n overflow: hidden;\n }\n\n .report-counts div {\n flex: 1;\n padding: 10px 0;\n }\n\n .report-counts b {\n display: block;\n font-size: 20px;\n }\n\n .report-counts small {\n font-size: 11px;\n color: #888;\n }\n\n .report-counts div[pass] b {\n color: #2e7d32;\n }\n\n .report-counts div[fail] b {\n color: #c62828;\n }\n\n .report-counts div[etc] b {\n color: #b7791f;\n }\n\n .report-item {\n border-bottom: 1px solid #f0f0f0;\n font-size: 13px;\n color: #333;\n }\n\n .report-head {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 10px 0;\n cursor: pointer;\n }\n\n .report-head .report-text {\n flex: 1;\n min-width: 0;\n }\n\n .report-caret {\n --md-icon-size: 20px;\n color: #999;\n transition: transform 0.2s;\n }\n\n .report-caret[open] {\n transform: rotate(180deg);\n }\n\n .report-basis {\n display: flex;\n flex-direction: column;\n gap: 6px;\n font-size: 12px;\n color: #555;\n background: #f7f7f7;\n border-radius: 6px;\n padding: 10px;\n margin: 0 0 10px 0;\n }\n\n .report-basis .report-ai {\n white-space: pre-line;\n color: #333;\n }\n\n .report-basis .report-used {\n color: #888;\n }\n\n .report-item .verdict {\n font-weight: 700;\n flex-shrink: 0;\n }\n\n .report-item .verdict[pass] {\n color: #2e7d32;\n }\n\n .report-item .verdict[fail] {\n color: #c62828;\n }\n\n .report-item .verdict[etc] {\n color: #b7791f;\n }\n\n /* ─── 로딩 오버레이 ─── */\n .loading-overlay {\n position: fixed;\n inset: 0;\n background: rgba(0, 0, 0, 0.5);\n display: flex;\n justify-content: center;\n align-items: center;\n z-index: 2000;\n }\n\n .loading-overlay .box {\n background: #fff;\n padding: 32px 48px;\n border-radius: 12px;\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 12px;\n font-size: 14px;\n color: #555;\n }\n\n .empty-state {\n text-align: center;\n color: #999;\n font-size: 14px;\n padding: 60px 0;\n }\n `\n ]\n\n @state() project: any = {}\n @state() buildingInspection: any = {}\n @state() buildingInspectionId: string = ''\n\n @state() guide: any = null // plan-shots 응답 {shots, total_shots, markdown}\n @state() sets: (SetInfo | null)[] = [] // 촬영 건별 업로드된 세트 (shots 순서)\n @state() photos: { file: File; url: string; setIndex: number }[] = [] // inspect에 보낸 대표 프레임(표시/첨부용)\n @state() result: any = null // inspect 응답\n @state() mainPhotoIndex: number = 0\n\n @state() panel: PanelMode = 'none'\n @state() selectedItem: any = null\n @state() recaptureBase: number = 0 // 재검사 진입 시점의 프레임 수 (used_images 보정용)\n @state() recaptureSet: SetInfo | null = null // 재촬영으로 새로 올린 세트\n @state() setPickerFor: number | null = null // 세트 고르는 중인 촬영 번호 (-1 = 재촬영)\n @state() recentSets: any[] = [] // 측정 서버에 올라온 최근 세트 (앱이 촬영 직후 자동 전송)\n @state() recentLoading: boolean = false\n private autoAttachSince: number = 0 // 이 시각(초) 이후 업로드된 세트만 자동 등록\n @state() expandedReportId: string | null = null // 종합 리포트에서 펼친 항목(아코디언)\n\n /* 측정 패널 상태 */\n @state() measureSetIndex: number = 0\n @state() measureInputs: Record<string, string> = {}\n @state() measureRunning: boolean = false\n @state() measureMsg: string = ''\n @state() measureResult: any = null // 측정 서버 원본 응답 — apply-measurement에 가공 없이 전달\n @state() measureImageUrl: string = '' // 근거 이미지(오버레이/결과사진)\n @state() thicknessFrames: { slot: number; index: number; thumbUrl?: string }[] = []\n @state() thicknessSlot: number | null = null\n @state() thicknessFrameUrl: string = ''\n @state() thicknessClick: { x: number; y: number } | null = null\n\n @state() loading: boolean = false\n @state() loadingText: string = ''\n /** 뮤테이션 가능 여부('dcsp guest' 권한 보유 시 false) — 게스트에게는 생성/수정/삭제 버튼을 숨긴다 */\n @state() private canMutate = false\n\n @query('#setInput') private setInputEl!: HTMLInputElement\n\n /* 세트 업로드 대상: 촬영 건 인덱스(가이드 화면) 또는 -1(재촬영 패널) */\n private pendingSetIndex: number | null = null\n private objectUrls: string[] = [] // 페이지 이탈 시 정리할 blob URL들\n\n /* 촬영 앱에 다녀온 뒤 화면이 다시 보이면 올라온 세트를 찾아 자동 등록한다 */\n private _onVisible = () => {\n if (document.visibilityState === 'visible' && this.guide && !this.result) this._autoAttachTaggedSets()\n }\n\n async connectedCallback() {\n super.connectedCallback()\n document.addEventListener('visibilitychange', this._onVisible)\n this.canMutate = await canDcspMutate()\n this.updateContext()\n }\n\n disconnectedCallback() {\n document.removeEventListener('visibilitychange', this._onVisible)\n super.disconnectedCallback()\n }\n\n get context() {\n return {\n title: '검측 관리 상세 - AI 자동 검측'\n }\n }\n\n /* 엔진에 보낼 검측요청서: 체크리스트 항목 → {item_id, category, text} */\n get engineChecklist() {\n const items = this.buildingInspection?.checklist?.checklistItems || []\n return [...items]\n .filter(item => (item.name || '').trim()) // 이름 없는 항목은 검측 불가 — 엔진 검증 실패 방지\n .sort((a, b) => (a.sequence || 0) - (b.sequence || 0))\n .map(item => ({\n item_id: item.id,\n category: [item.mainType, item.detailType].filter(Boolean).join(' · '),\n text: item.name || '',\n // 검사 기준은 조문 '번호'가 아니라 본문을 보내야 판정 근거가 실제 기준에 붙는다.\n // (조문 번호만 주면 모델이 그 내용을 모르는 상태로 판단한다 — 엔진 안내)\n criteria_kcs: _kcsCriteriaText(item.kcsCriteria),\n criteria_site: (item.siteSpecCriteria || '').trim()\n }))\n }\n\n get uploadedSets(): SetInfo[] {\n return this.sets.filter((s): s is SetInfo => !!s)\n }\n\n render() {\n return html`\n <building-inspection-detail-header\n .buildingInspectionId=${this.buildingInspection?.id}\n .buildingLevelId=${this.buildingInspection?.buildingLevel?.id}\n .projectName=${this.project.name}\n .buildingName=${this.buildingInspection?.buildingLevel?.building?.name}\n .buildingLevelFloor=${this.buildingInspection?.buildingLevel?.floor}\n .projectId=${this.project.id}\n ></building-inspection-detail-header>\n\n <div body>\n <div class=\"page-title\">\n AI 자동 검측 – ${this.buildingInspection?.checklist?.location || ''}\n <span target>${this.buildingInspection?.checklist?.name || ''}</span>\n </div>\n\n ${this.result ? this._renderResult() : this._renderGuide()}\n </div>\n\n <!-- 세트 파일 선택: video.mov/poses.jsonl/meta.json 3개 멀티선택 또는 zip 1개.\n accept을 두지 않는다 — iOS는 확장자를 UTI로 바꿔 거르는데 .jsonl은 매핑이 없어\n 파일 앱에서 poses.jsonl이 비활성으로 보인다. 파일명 검증은 아래 핸들러가 한다. -->\n <input id=\"setInput\" type=\"file\" multiple @change=${this._onSetFilesSelected} />\n\n ${\n this.loading\n ? html`\n <div class=\"loading-overlay\">\n <div class=\"box\">\n <md-circular-progress indeterminate></md-circular-progress>\n <span>${this.loadingText}</span>\n </div>\n </div>\n `\n : ''\n }\n `\n }\n\n /* ─── 1단계: 촬영 가이드 + 세트 업로드 화면 ─── */\n private _renderGuide() {\n if (!this.guide) {\n return html`<div class=\"empty-state\">촬영 가이드를 준비 중입니다...</div>`\n }\n\n const shots = this.guide.shots || []\n const total = this.guide.total_shots || shots.length\n const uploaded = this.uploadedSets.length\n const current = shots[Math.min(uploaded, shots.length - 1)]\n const done = uploaded >= total\n\n return html`\n <div class=\"guide-container\">\n <div class=\"step-badge\">동영상 ${Math.min(uploaded + 1, total)}/${total} · ${current?.target || '촬영'}</div>\n <div class=\"guide-title\">${current?.target || ''}${done ? ' 촬영 완료' : ''}</div>\n <div class=\"guide-desc\">\n 전용 촬영 앱(LidarInspector)으로 동영상을 촬영한 뒤, 앱이 만든 파일 3개(video.mov·poses.jsonl·meta.json)를 촬영 건마다\n 업로드해주세요. 일반 카메라 동영상은 사용할 수 없습니다.\n </div>\n\n <div class=\"card\">\n <h4>촬영 가이드 (동영상 ${total}건)</h4>\n <ul>\n ${shots.map(s => html`<li>촬영 ${s.shot_no || ''} · ${s.target} — ${s.how}</li>`)}\n </ul>\n </div>\n\n <div class=\"card\">\n <h4>공통 촬영법 — 옆으로 이동 · 대상 정면 유지 · 대상 전체 포함</h4>\n <img class=\"capture-guide-img\" src=${captureGuideImg} alt=\"촬영 안내\" />\n </div>\n\n <div class=\"card\" style=\"display: flex; flex-direction: column; gap: 10px;\">\n <div class=\"progress-row\">\n <span>촬영 세트 업로드</span>\n <span>${uploaded} / ${total}</span>\n </div>\n <div class=\"progress-bar\"><div style=\"width: ${total ? (uploaded / total) * 100 : 0}%\"></div></div>\n ${shots.map((s, i) => {\n const set = this.sets[i]\n return html`\n <div class=\"set-card\" ?uploaded=${!!set} @click=${() => !set && this._openSetChooser(i)}>\n <md-icon>${set ? 'check_circle' : 'video_file'}</md-icon>\n <div class=\"set-main\">\n <b>촬영 ${s.shot_no || i + 1} · ${s.target}</b>\n ${\n set\n ? html`세트 연결 완료 (${set.setId}) ${set.warnings.map(w => html`<div class=\"set-warn\">⚠ ${w}</div>`)}`\n : html`「앱으로 촬영」을 누르면 촬영 후 이 칸에 자동 등록됩니다 · 탭하면 직접 선택`\n }\n </div>\n ${\n set\n ? html`<button\n class=\"text-button\"\n @click=${(e: Event) => {\n e.stopPropagation()\n this._openSetChooser(i)\n }}\n >\n 교체\n </button>`\n : html`<a class=\"shoot-link\" href=${this._shotAppLink(s, i)} @click=${(e: Event) => e.stopPropagation()}>\n <md-icon>photo_camera</md-icon>앱으로 촬영\n </a>`\n }\n </div>\n ${this.setPickerFor === i ? this._renderSetChooser(i) : ''}\n `\n })}\n </div>\n\n <button class=\"primary-button\" ?disabled=${uploaded === 0} @click=${() => this._runInspection()}>\n AI 자동 판정 실행 ${uploaded ? `(세트 ${uploaded}/${total})` : ''}\n </button>\n </div>\n `\n }\n\n /* ─── 2단계: 판정 결과 화면 ─── */\n\n /* 항목 그룹: auto(판정완료) / recapture(재촬영) / measure(기준값 입력) / manual(AI 미지원·오류) */\n private _groupOf(item: any): 'auto' | 'recapture' | 'measure' | 'manual' {\n if (item.verdict === 'pass' || item.verdict === 'fail') return 'auto'\n if (item.verdict === 'hold') return 'recapture'\n if (item.verdict === 'pending' && item.pending_reason === 'measure') return 'measure'\n return 'manual'\n }\n\n /* verdict → 화면 라벨 (pending은 pending_reason으로 세분) */\n private _verdictLabel(item: any): string {\n if (item.verdict === 'pending') {\n return item.pending_reason === 'measure' ? '기준값 입력 필요' : 'AI 미지원'\n }\n return VERDICT_LABEL[item.verdict] || item.verdict\n }\n\n private _renderResult() {\n const items = this._sortedItems()\n const autoItems = items.filter(it => this._groupOf(it) === 'auto')\n const recaptureItems = items.filter(it => this._groupOf(it) === 'recapture')\n const measureItems = items.filter(it => this._groupOf(it) === 'measure')\n const manualItems = items.filter(it => this._groupOf(it) === 'manual')\n const moreCount = recaptureItems.length + measureItems.length + manualItems.length\n\n // 클릭한 항목의 used_images만 표시 (선택 없으면 전체 항목 합집합). used_images는 전체 프레임 기준 1-based\n const focusItems = this.selectedItem ? [this.selectedItem] : items\n const usedNos = new Set<number>()\n for (const it of focusItems) for (const n of it.used_images || []) usedNos.add(n)\n const usedPhotos = this.photos.map((photo, i) => ({ photo, no: i + 1 })).filter(x => usedNos.has(x.no))\n const mainPhoto = usedPhotos[this.mainPhotoIndex]\n\n let no = 0\n\n return html`\n <div class=\"result-body\">\n <div class=\"photo-pane\">\n <div class=\"caption\">판정에 사용된 프레임 (동영상에서 추출)</div>\n <div class=\"photo-main\">${mainPhoto ? html`<img src=${mainPhoto.photo.url} alt=\"현장 프레임\" />` : ''}</div>\n <div class=\"photo-thumbs\">\n ${usedPhotos.map(\n (x, i) => html`\n <img\n src=${x.photo.url}\n alt=\"프레임 ${x.no}\"\n ?selected=${i === this.mainPhotoIndex}\n @click=${() => (this.mainPhotoIndex = i)}\n />\n `\n )}\n </div>\n </div>\n\n <div class=\"items-pane\">\n <div class=\"summary-banner\">\n 적용 항목 ${items.length}개 · 자동 판정 ${autoItems.length}개 · 추가 작업 ${moreCount}개\n </div>\n\n ${\n autoItems.length\n ? html`\n <div class=\"group-title\">자동 판정 완료 (${autoItems.length})</div>\n ${autoItems.map(it => this._renderItemCard(it, ++no))}\n `\n : ''\n }\n ${\n moreCount\n ? html`\n <div class=\"group-title\">추가 작업 필요 (${moreCount} 남음)</div>\n ${\n recaptureItems.length\n ? html`\n <div class=\"group-subtitle\">재촬영 필요 (${recaptureItems.length})</div>\n ${recaptureItems.map(it => this._renderItemCard(it, ++no))}\n `\n : ''\n }\n ${\n measureItems.length\n ? html`\n <div class=\"group-subtitle\">기준값 입력 필요 — 3D 계측 (${measureItems.length})</div>\n ${measureItems.map(it => this._renderItemCard(it, ++no))}\n `\n : ''\n }\n ${\n manualItems.length\n ? html`\n <div class=\"group-subtitle\">AI 미지원 — 감리자 수동 확인 (${manualItems.length})</div>\n ${manualItems.map(it => this._renderItemCard(it, ++no))}\n `\n : ''\n }\n `\n : ''\n }\n\n <button class=\"primary-button\" @click=${this._openReport}>종합 검사 리포트</button>\n </div>\n\n ${this.panel !== 'none' ? this._renderSidePane() : ''}\n </div>\n `\n }\n\n private _renderItemCard(item: any, no: number) {\n const group = this._groupOf(item)\n // 측정 완료 항목은 summary(측정 한 줄 설명)를 자르지 않고 그대로, VLM 항목은 관찰/사유\n const desc =\n item.measurements && item.reason\n ? item.reason\n : item.observation\n ? `관찰: ${item.observation}`\n : item.reason || item.measure?.question || ''\n\n return html`\n <div class=\"item-card\" ?selected=${this.selectedItem?.item_id === item.item_id} @click=${() => this._openDetail(item)}>\n <div class=\"item-no\">${no}</div>\n <div class=\"item-main\">\n <div class=\"item-name\">${item.text}</div>\n <div>\n ${\n group === 'auto'\n ? html`<span class=\"chip\">${ROUTING_LABEL[item.routing] || item.routing}</span>\n <span class=\"chip-verdict\">${this._verdictLabel(item)}</span>`\n : group === 'recapture'\n ? html`<span class=\"chip\">추가 촬영 필요</span>`\n : group === 'measure'\n ? html`<span class=\"chip\">AI 측정 모델</span> <span class=\"chip-verdict\">기준값 입력 필요</span>`\n : html`<span class=\"chip\">미지원</span>`\n }\n </div>\n <div class=\"item-desc\">${desc}</div>\n </div>\n ${\n group === 'auto'\n ? html`\n <div class=\"badge\" ?pass=${item.verdict === 'pass'} ?fail=${item.verdict === 'fail'}>\n ${VERDICT_LABEL[item.verdict]}\n </div>\n `\n : group === 'recapture'\n ? html`\n <button\n class=\"capture-button\"\n @click=${(e: Event) => {\n e.stopPropagation()\n this._openRecapture(item)\n }}\n >\n 촬영하기\n </button>\n `\n : group === 'measure'\n ? html`\n <button\n class=\"measure-button\"\n @click=${(e: Event) => {\n e.stopPropagation()\n this._openMeasure(item)\n }}\n >\n ${item.measure?.next_action === 'select_and_input' ? '측정 진행' : '기준값 입력'}\n </button>\n `\n : html`<div class=\"badge\" etc>${this._verdictLabel(item)}</div>`\n }\n </div>\n `\n }\n\n /* ─── 우측 패널: 상세 / 재촬영 / 측정 / 리포트 ─── */\n private _renderSidePane() {\n if (this.panel === 'detail' && this.selectedItem) return this._renderDetailPane(this.selectedItem)\n if (this.panel === 'recapture' && this.selectedItem) return this._renderRecapturePane(this.selectedItem)\n if (this.panel === 'measure' && this.selectedItem) return this._renderMeasurePane(this.selectedItem)\n if (this.panel === 'report') return this._renderReportPane()\n return ''\n }\n\n private _renderDetailPane(item: any) {\n const auto = item.verdict === 'pass' || item.verdict === 'fail'\n const routingLabel = ROUTING_LABEL[item.routing] || item.routing\n const verdictLabel = this._verdictLabel(item)\n const measured = !!item.measurements // 측정 모델로 판정된 항목 — 신뢰도는 확률이 없어 비운다\n\n return html`\n <div class=\"side-pane\">\n <div class=\"detail-header\">\n <span class=\"badge\" ?pass=${item.verdict === 'pass'} ?fail=${item.verdict === 'fail'} ?etc=${!auto}>\n ${routingLabel}\n </span>\n <h3>${verdictLabel}</h3>\n </div>\n <div class=\"detail-summary\">${(item.observation || item.ai_report || '').trim()}</div>\n <div class=\"kv-grid\">\n <div class=\"kv\">\n <label>판정</label>\n <span class=\"verdict-value\" ?pass=${item.verdict === 'pass'} ?fail=${item.verdict === 'fail'}>\n ${verdictLabel || '-'}\n </span>\n </div>\n ${\n !measured && item.confidence != null\n ? html`\n <div class=\"kv\">\n <label>신뢰도</label>\n <span>${Math.round(item.confidence * 100)}%</span>\n </div>\n `\n : ''\n }\n <div class=\"kv\">\n <label>처리</label>\n <span>${routingLabel || '-'}</span>\n </div>\n </div>\n\n <div class=\"reason-box\">\n <div class=\"reason-verdict\">\n <label style=\"font-size: 11px;color: #7d2f2f; display: block; font-weight: bold;\">판단 근거</label>\n ${item.reason}\n </div>\n </div>\n\n ${item.image_data ? html`<img class=\"evidence-img\" src=${item.image_data} alt=\"측정 근거 이미지\" />` : ''}\n\n <button class=\"text-button\" @click=${this._closePanel}>닫기</button>\n </div>\n `\n }\n\n private _renderRecapturePane(item: any) {\n const shot = item.recapture_shots?.[0]\n\n return html`\n <div class=\"side-pane\">\n <h3>${item.text}</h3>\n <div class=\"why-box\">\n <b>왜 재촬영이 필요한가요?</b><br />\n ${item.reason || '판정을 위해 추가 촬영이 필요합니다.'}\n </div>\n ${\n shot\n ? html`\n <div>\n <h4 style=\"margin: 0 0 8px 0; font-size: 13px;\">촬영 가이드</h4>\n <div style=\"font-size: 12px; color: #555;\">${shot.target} — ${shot.how}</div>\n </div>\n `\n : ''\n }\n <div class=\"app-links\">\n <span>앱으로 재촬영</span>\n <a href=${`${appCaptureLink(this._shotTechnique(shot))}&set=${encodeURIComponent(this._shotTag(0))}`}> 촬영 시작 </a>\n </div>\n <div class=\"set-card\" ?uploaded=${!!this.recaptureSet} @click=${() => this._openSetChooser(-1)}>\n <md-icon>${this.recaptureSet ? 'check_circle' : 'video_file'}</md-icon>\n <div class=\"set-main\">\n <b>재촬영 세트</b>\n ${\n this.recaptureSet\n ? html`세트 업로드 완료 ${this.recaptureSet.warnings.map(w => html`<div class=\"set-warn\">⚠ ${w}</div>`)}`\n : html`앱으로 재촬영한 세트를 선택 (또는 파일 직접 선택)`\n }\n </div>\n </div>\n ${this.setPickerFor === -1 ? this._renderSetChooser(-1) : ''}\n ${\n this.recaptureSet ? html`<button class=\"primary-button\" @click=${() => this._runInspection()}>재검사 실행</button>` : ''\n }\n <button class=\"text-button\" @click=${this._closePanel}>닫기</button>\n </div>\n `\n }\n\n /* ─── 측정 패널 (④ 철근 배근 길이 / ⑤ 기둥·벽체 두께) ─── */\n\n /* operator_inputs 정의 기반 숫자/텍스트 입력 렌더 (slot·click·n_frames는 별도 UI/고정) */\n private _renderMeasureFields(item: any) {\n const defs = item.measure?.operator_inputs || []\n const fields: { key: string; label: string; desc?: string; def?: any }[] = []\n for (const d of defs) {\n if (d.key === 'n_frames' || d.key === 'slot' || d.key === 'click') continue\n if (d.fields) {\n // 복합 입력(targets 등): 하위 필드를 각각 입력으로 펼친다\n for (const [k, desc] of Object.entries(d.fields)) {\n if (k === 'name') continue // 부재명은 검사 항목명으로 자동 지정\n fields.push({ key: k, label: FIELD_LABEL[k] || k, desc: String(desc) })\n }\n } else {\n fields.push({ key: d.key, label: FIELD_LABEL[d.key] || d.key, desc: d.desc, def: d.default })\n }\n }\n return fields.map(\n f => html`\n <div class=\"measure-field\">\n <label title=${f.desc || ''}>${f.label}${f.desc ? html` <span style=\"color:#aaa\">— ${f.desc}</span>` : ''}</label>\n <input\n type=\"number\"\n inputmode=\"decimal\"\n .value=${this.measureInputs[f.key] ?? (f.def != null ? String(f.def) : '')}\n placeholder=\"도면값\"\n @input=${(e: Event) => {\n this.measureInputs = { ...this.measureInputs, [f.key]: (e.target as HTMLInputElement).value }\n }}\n />\n </div>\n `\n )\n }\n\n private _renderMeasurePane(item: any) {\n const measure = item.measure || {}\n const isThickness = measure.next_action === 'select_and_input'\n const setOptions = this.uploadedSets\n const done = !!this.measureResult\n\n return html`\n <div class=\"side-pane\">\n <h3>${item.text}</h3>\n <div class=\"detail-header\">\n <span class=\"chip\">3D 계측</span>\n <span style=\"font-size: 12px; color: #777;\">${measure.name || ''} (${measure.status || ''})</span>\n </div>\n ${measure.capture_guide ? html`<div class=\"why-box\">📷 ${measure.capture_guide}</div>` : ''}\n <img\n class=\"capture-guide-img\"\n style=\"background: #fff; border: 1px solid #eee; padding: 6px;\"\n src=${isThickness ? pictoMemberImg : pictoRebarImg}\n alt=\"촬영 안내\"\n />\n\n ${\n setOptions.length > 1\n ? html`\n <div class=\"measure-field\">\n <label>측정할 촬영 세트</label>\n <select\n .value=${String(this.measureSetIndex)}\n @change=${(e: Event) => this._onMeasureSetChange(parseInt((e.target as HTMLSelectElement).value))}\n >\n ${setOptions.map(\n (s, i) =>\n html`<option value=${i} ?selected=${i === this.measureSetIndex}>\n 세트 ${i + 1}${s.technique ? ` (${s.technique})` : ''}\n </option>`\n )}\n </select>\n </div>\n `\n : ''\n }\n ${isThickness ? this._renderThicknessPicker() : ''} ${this._renderMeasureFields(item)}\n ${\n this.measureRunning\n ? html`\n <div class=\"measure-msg\">\n <md-circular-progress indeterminate></md-circular-progress>\n <span>${this.measureMsg || '측정 중...'}</span>\n </div>\n `\n : html`\n <button\n class=\"primary-button\"\n ?disabled=${isThickness && (this.thicknessSlot === null || !this.thicknessClick)}\n @click=${() => (isThickness ? this._runThicknessMeasure(item) : this._runRebarMeasure(item))}\n >\n ${done ? '다시 측정' : isThickness ? '측정 실행 (30~40초)' : '측정 시작 (약 45초)'}\n </button>\n `\n }\n ${\n done\n ? html`\n ${\n this.measureResult.summary || this.measureResult.summary_line || this.measureResult.headline\n ? html`<div class=\"measure-summary\">\n ${this.measureResult.summary || this.measureResult.summary_line || this.measureResult.headline}\n </div>`\n : ''\n }\n ${this.measureImageUrl ? html`<img class=\"evidence-img\" src=${this.measureImageUrl} alt=\"측정 근거\" />` : ''}\n ${\n this.canMutate\n ? html`<button class=\"primary-button\" @click=${() => this._applyMeasurement(item)}>판정 확정</button>`\n : ''\n }\n `\n : ''\n }\n\n <button class=\"text-button\" @click=${this._closePanel}>닫기</button>\n </div>\n `\n }\n\n /* ⑤ 두께: 프레임 선택 + 측정면 클릭 (자동 면 선택은 정확도가 낮아 클릭 단계 생략 불가) */\n private _renderThicknessPicker() {\n return html`\n <div class=\"measure-field\">\n <label>① 모서리가 잘 보이는 프레임을 고르세요</label>\n <div class=\"frame-strip\">\n ${this.thicknessFrames.map(\n f => html`\n <img\n src=${f.thumbUrl || ''}\n alt=\"프레임 ${f.index}\"\n ?selected=${this.thicknessSlot === f.slot}\n @click=${() => this._selectThicknessFrame(f.slot)}\n />\n `\n )}\n </div>\n </div>\n ${\n this.thicknessFrameUrl\n ? html`\n <div class=\"measure-field\">\n <label>② 잴 면의 가운데를 한 번 탭하세요 (모서리·철근 위 말고 <b>면 위</b>)</label>\n <div class=\"click-stage\">\n <img src=${this.thicknessFrameUrl} alt=\"선택 프레임\" @click=${this._onThicknessClick} />\n ${\n this.thicknessClick\n ? html`<div\n class=\"click-dot\"\n style=\"left: ${this.thicknessClick.x * 100}%; top: ${this.thicknessClick.y * 100}%\"\n ></div>`\n : ''\n }\n </div>\n </div>\n `\n : ''\n }\n `\n }\n\n private _renderReportPane() {\n const items = this._sortedItems()\n const summary = this.result?.summary || {}\n const etcCount = (summary.hold || 0) + (summary.pending || 0) + (summary.error || 0)\n\n return html`\n <div class=\"side-pane\">\n <h3>종합 검사 리포트</h3>\n <div class=\"report-counts\">\n <div pass><b>${summary.pass || 0}</b><small>적합</small></div>\n <div fail><b>${summary.fail || 0}</b><small>부적합</small></div>\n <div etc><b>${etcCount}</b><small>미검사</small></div>\n </div>\n <div style=\"overflow-y: auto; max-height: 380px;\">\n ${items.map((it, i) => {\n const expanded = this.expandedReportId === it.item_id\n return html`\n <div class=\"report-item\">\n <div class=\"report-head\" @click=${() => this._toggleReportItem(it.item_id)}>\n <span class=\"report-text\">${i + 1}. ${it.text}</span>\n <span\n class=\"verdict\"\n ?pass=${it.verdict === 'pass'}\n ?fail=${it.verdict === 'fail'}\n ?etc=${it.verdict !== 'pass' && it.verdict !== 'fail'}\n >\n ${this._verdictLabel(it)}\n </span>\n <md-icon class=\"report-caret\" ?open=${expanded}>expand_more</md-icon>\n </div>\n ${\n expanded\n ? html`\n <div class=\"report-basis\">\n ${it.ai_report ? html`<div class=\"report-ai\">${(it.ai_report || '').trim()}</div>` : ''}\n ${it.observation ? html`<div>관찰: ${it.observation}</div>` : ''}\n ${it.reason ? html`<div>판단: ${it.reason}</div>` : ''}\n ${\n it.used_images?.length\n ? html`<div class=\"report-used\">근거 프레임: ${it.used_images.map(n => `#${n}`).join(', ')}</div>`\n : ''\n }\n </div>\n `\n : ''\n }\n </div>\n `\n })}\n </div>\n ${this.canMutate ? html`<button class=\"primary-button\" @click=${this._registerInspection}>검사 등록</button>` : ''}\n <button class=\"text-button\" @click=${this._closePanel}>닫기</button>\n </div>\n `\n }\n\n /* ─── 라이프사이클 ─── */\n async pageUpdated(changes: any, lifecycle: PageLifecycle) {\n if (this.active) {\n this._resetAll()\n this.buildingInspectionId = lifecycle.resourceId || ''\n await this.initBuildingInspection(this.buildingInspectionId)\n await this._loadShotGuide()\n }\n }\n\n async initBuildingInspection(buildingInspectionId: string = '') {\n const response = await client.query({\n query: gql`\n query BuildingInspection($buildingInspectionId: String!) {\n buildingInspection(id: $buildingInspectionId) {\n id\n status\n checklist {\n id\n name\n location\n checklistItems {\n id\n sequence\n mainType\n detailType\n name\n kcsCriteria\n siteSpecCriteria\n }\n }\n buildingLevel {\n id\n floor\n building {\n id\n name\n buildingComplex {\n id\n }\n }\n }\n }\n }\n `,\n variables: { buildingInspectionId }\n })\n\n if (response.errors) return\n\n this.buildingInspection = response.data.buildingInspection\n\n // 삭제(soft delete)됐거나 다른 projectType의 검측이면 서버가 null을 준다.\n // 그대로 진행하면 뒤 쿼리에 undefined가 실려 GraphQL 에러가 난다.\n if (!this.buildingInspection) {\n notify({ message: '삭제되었거나 접근할 수 없는 검측입니다.', level: 'warn' })\n return\n }\n\n await this._getProjectByBuildingComplexId(this.buildingInspection?.buildingLevel?.building?.buildingComplex?.id)\n }\n\n private async _getProjectByBuildingComplexId(buildingComplexId) {\n const response = await client.query({\n query: gql`\n query ProjectByBuildingComplexId($buildingComplexId: String!) {\n project: projectByBuildingComplexId(buildingComplexId: $buildingComplexId) {\n id\n name\n }\n }\n `,\n variables: { buildingComplexId }\n })\n\n if (response.errors) return\n\n this.project = response.data.project\n }\n\n /* ─── 서버 호출 공통 ─── */\n\n /* 엔진 실행 공통 호출: input(JSON) + 파일들을 multipart로 전송 */\n private async _callEngine(input: any, files: File[] = []) {\n const form = new FormData()\n form.append('input', JSON.stringify(input))\n for (const file of files) form.append('files', file, file.name)\n\n const response = await fetch(ENGINE_RUN_URL, {\n method: 'POST',\n headers: { Authorization: ENGINE_AUTH },\n body: form\n })\n const raw = await response.json()\n const data = raw?.result || {}\n if (data?.status !== 'success') {\n throw new Error(data?.error || raw?.error || 'AI 엔진 호출에 실패했습니다.')\n }\n return data.result\n }\n\n /* 측정 서버 호출 (JSON 응답) */\n private async _callMeasure(path: string, init: RequestInit = {}) {\n const response = await fetch(`${MEASURE_BASE_URL}${path}`, {\n ...init,\n headers: { ...((init.headers as any) || {}), Authorization: MEASURE_AUTH }\n })\n const data = await response.json().catch(() => ({}))\n if (!response.ok) {\n const msg = data?.errors?.join('\\n') || data?.detail || data?.error || `측정 서버 오류 (${response.status})`\n throw new Error(msg)\n }\n return data\n }\n\n /* 측정 서버 이미지 → blob URL (img src는 인증 헤더를 못 실어서 fetch로 받는다) */\n private async _fetchMeasureImage(path: string): Promise<string> {\n const response = await fetch(`${MEASURE_BASE_URL}${path}`, { headers: { Authorization: MEASURE_AUTH } })\n if (!response.ok) throw new Error(`이미지 수신 실패 (${response.status})`)\n const url = URL.createObjectURL(await response.blob())\n this.objectUrls.push(url)\n return url\n }\n\n /* [1단계] 촬영 가이드 생성 (plan-shots) */\n private async _loadShotGuide() {\n const checklist = this.engineChecklist\n if (!checklist.length) {\n notify({ message: '체크리스트 항목이 없습니다.', level: 'warn' })\n return\n }\n\n try {\n this.loading = true\n this.loadingText = 'AI 촬영 가이드 생성 중...'\n this.guide = await this._callEngine({ action: 'plan-shots', checklist })\n this.sets = new Array((this.guide?.shots || []).length).fill(null)\n // 어느 촬영에도 배정되지 않은 항목이 있으면 그 항목은 판정 근거가 없다 → 재생성 권고\n const unassigned = this.guide?.unassigned_items || []\n if (unassigned.length) {\n notify({\n message: `촬영에 배정되지 않은 검사항목이 ${unassigned.length}건 있습니다. 촬영 가이드를 다시 생성해보세요.`,\n level: 'warn'\n })\n }\n // 자동 등록 기준 시각 — 이 시점 이후 올라온 세트만 자동으로 붙인다.\n // (예전 테스트 세트가 태그만 같다고 채워지면 \"찍지도 않았는데 완료\"로 보인다)\n this.autoAttachSince = Date.now() / 1000\n } catch (error) {\n console.error('촬영 가이드 생성 실패:', error)\n notify({ message: (error as Error).message, level: 'error' })\n } finally {\n this.loading = false\n }\n }\n\n /* plan-shots가 준 촬영별 항목 배정 → {촬영번호: [항목ID]} (엔진 inspect 의 shot_items).\n 배정 정보가 없는 구버전 응답이면 null 을 돌려 종전대로(전 항목이 전 사진) 동작시킨다. */\n private _shotItemsMap(): Record<string, string[]> | null {\n const shots = this.guide?.shots || []\n const map: Record<string, string[]> = {}\n for (let i = 0; i < shots.length; i++) {\n const items = shots[i]?.items\n if (!Array.isArray(items) || !items.length) continue\n map[String(shots[i]?.shot_no || i + 1)] = items\n }\n return Object.keys(map).length ? map : null\n }\n\n /* 세트가 아직 안 올라온 촬영에 배정된 항목 ID 집합 (그 항목은 판정할 사진이 없다) */\n private _itemsAwaitingShot(): Set<string> {\n const pending = new Set<string>()\n const shots = this.guide?.shots || []\n for (let i = 0; i < shots.length; i++) {\n if (this.sets[i]) continue\n for (const id of shots[i]?.items || []) pending.add(id)\n }\n return pending\n }\n\n /* 촬영 칸마다 고유 태그 — 앱에 부재 ID로 넘겨 두면, 올라온 세트의 member_id로\n \"어느 촬영 칸의 것인지\" 되찾을 수 있다 (앱↔플랫폼 왕복에 식별자가 없어서 쓰는 방법) */\n private _shotTag(shotNo: number) {\n return `${(this.buildingInspectionId || 'ins').replace(/-/g, '').slice(0, 6)}-${shotNo}`\n }\n\n /* 촬영 지시문에서 기술 추론 — 앱의 촬영 안내만 달라진다(측정은 meta.technique를 안 봄) */\n private _shotTechnique(shot: any): 'cover' | 'thick' {\n const text = `${shot?.target || ''} ${shot?.how || ''}`\n if (/두께|콘크리트\\s*면|거푸집|탈형|벽체\\s*면/.test(text)) return 'thick'\n return 'cover'\n }\n\n private _shotAppLink(shot: any, index: number) {\n const tag = this._shotTag(shot?.shot_no || index + 1)\n return `${appCaptureLink(this._shotTechnique(shot))}&set=${encodeURIComponent(tag)}`\n }\n\n /* 앱에서 촬영하고 돌아오면 태그로 찾아 해당 촬영 칸에 자동 등록 */\n private async _autoAttachTaggedSets() {\n if (!this.guide?.shots?.length) return\n await this._loadRecentSets()\n const used = new Set(this.uploadedSets.map(s => s.setId))\n const attached: number[] = []\n const next = [...this.sets]\n\n this.guide.shots.forEach((shot: any, i: number) => {\n if (next[i]) return\n const tag = this._shotTag(shot?.shot_no || i + 1)\n // 이 화면을 연 뒤에 올라온 것만 — 예전 세트는 목록에서 직접 고르게 둔다\n const hit = this.recentSets.find(\n s => s.member_id === tag && !used.has(s.set_id) && (s.uploaded_at || 0) >= this.autoAttachSince\n )\n if (!hit) return\n used.add(hit.set_id)\n next[i] = { setId: hit.set_id, technique: hit.technique, label: `세트 ${hit.set_id}`, warnings: [] }\n attached.push(shot?.shot_no || i + 1)\n })\n\n if (attached.length) {\n this.sets = next\n notify({ message: `촬영 ${attached.join('·')} 세트를 자동으로 등록했습니다.` })\n }\n }\n\n /* 세트 선택 목록 — 앱이 올린 최근 세트 + 파일 직접 선택 폴백 */\n private _renderSetChooser(index: number) {\n return html`\n <div class=\"set-chooser\">\n ${\n this.recentLoading\n ? html`<div class=\"chooser-empty\">불러오는 중...</div>`\n : this.recentSets.length\n ? this.recentSets.map(\n s => html`\n <button class=\"chooser-row\" @click=${() => this._pickExistingSet(index, s)}>\n <b>${_setTimeLabel(s.set_id)}</b>\n <span>\n ${s.member_id ? `${s.member_id} · ` : ''}${s.technique || '기술 미상'}\n ${s.duration_sec ? ` · ${Math.round(s.duration_sec)}초` : ''}\n </span>\n </button>\n `\n )\n : html`<div class=\"chooser-empty\">\n 올라온 세트가 없습니다. 카드의 「앱으로 촬영」으로 찍으면 여기에 나타납니다.\n </div>`\n }\n <div class=\"chooser-actions\">\n <button class=\"text-button\" @click=${() => this._loadRecentSets()}>새로고침</button>\n <button class=\"text-button\" @click=${() => this._openSetPicker(index)}>파일 직접 선택</button>\n </div>\n </div>\n `\n }\n\n /* ─── 세트 선택/업로드 ─── */\n\n /* 촬영 앱이 측정 서버로 바로 올린 세트 목록 (앱에서 촬영 후 저장하면 자동 전송된다) */\n private async _loadRecentSets() {\n try {\n this.recentLoading = true\n const data = await this._callMeasure('/api/sets?limit=20')\n this.recentSets = data.sets || []\n } catch (error) {\n console.error('세트 목록 조회 실패:', error)\n this.recentSets = []\n } finally {\n this.recentLoading = false\n }\n }\n\n /* 카드 탭 → 목록 펼치기 (이미 고른 세트는 제외하고 보여준다) */\n private _openSetChooser(index: number) {\n this.setPickerFor = this.setPickerFor === index ? null : index\n if (this.setPickerFor !== null) this._loadRecentSets()\n }\n\n /* 목록에서 세트 선택 — 이미 서버에 있으므로 업로드 없이 연결만 한다 */\n private _pickExistingSet(index: number, s: any) {\n const set: SetInfo = {\n setId: s.set_id,\n technique: s.technique,\n label: `세트 ${s.set_id}`,\n warnings: []\n }\n if (index === -1) {\n this.recaptureSet = set\n } else {\n const next = [...this.sets]\n next[index] = set\n this.sets = next\n }\n this.setPickerFor = null\n }\n\n private _openSetPicker(index: number) {\n this.pendingSetIndex = index\n this.setPickerFor = null\n this.setInputEl?.click()\n }\n\n private async _onSetFilesSelected(event: Event) {\n const input = event.target as HTMLInputElement\n const files = Array.from(input?.files || [])\n input.value = ''\n const index = this.pendingSetIndex\n this.pendingSetIndex = null\n if (!files.length || index === null) return\n\n // zip 1개 또는 필수 3파일 검증 (한 번의 선택으로 3개 멀티선택)\n const isZip = files.length === 1 && /\\.zip$/i.test(files[0].name)\n if (!isZip) {\n const names = files.map(f => f.name.toLowerCase())\n const missing = SET_FILES.filter(n => !names.includes(n))\n if (missing.length) {\n notify({\n message: `세트 파일이 부족합니다. 누락: ${missing.join(', ')} — 촬영 앱이 만든 3개 파일을 한 번에 선택해주세요.`,\n level: 'warn'\n })\n return\n }\n }\n\n try {\n this.loading = true\n this.loadingText = '촬영 세트 업로드 중...'\n const form = new FormData()\n for (const f of files) if (isZip || SET_FILES.includes(f.name.toLowerCase())) form.append('files', f, f.name)\n const data = await this._callMeasure('/api/sets', { method: 'POST', body: form })\n\n const set: SetInfo = {\n setId: data.set_id,\n technique: data.technique,\n label: `세트 ${data.set_id}`,\n warnings: data.warnings || []\n }\n if (index === -1) {\n this.recaptureSet = set\n } else {\n const next = [...this.sets]\n next[index] = set\n this.sets = next\n }\n for (const w of set.warnings) notify({ message: `업로드 경고: ${w}`, level: 'warn' })\n } catch (error) {\n console.error('세트 업로드 실패:', error)\n notify({ message: (error as Error).message, level: 'error' })\n } finally {\n this.loading = false\n }\n }\n\n /* 세트의 대표 3프레임(vlm)을 받아 File 목록으로 (시간순 유지) */\n private async _fetchVlmFrames(set: SetInfo, setIndex: number): Promise<{ file: File; url: string; setIndex: number }[]> {\n const data = await this._callMeasure(`/api/sets/${set.setId}/vlm-frames`)\n const out: { file: File; url: string; setIndex: number }[] = []\n for (const f of data.frames || []) {\n const response = await fetch(`${MEASURE_BASE_URL}${f.url}`, { headers: { Authorization: MEASURE_AUTH } })\n if (!response.ok) throw new Error(`프레임 수신 실패 (${response.status})`)\n const blob = await response.blob()\n const file = new File([blob], `set${setIndex + 1}_${f.name}`, { type: 'image/jpeg' })\n const url = URL.createObjectURL(file)\n this.objectUrls.push(url)\n out.push({ file, url, setIndex })\n }\n return out\n }\n\n /* [2단계] 자동 판정 실행 (inspect)\n * - 최초 판정: 업로드된 모든 세트의 대표 3프레임 + 전체 체크리스트 (input_kind=video_frames)\n * - 재검사(재촬영 패널): 새 세트의 3프레임만 + 해당 항목만 재판정 후 결과 병합 */\n private async _runInspection() {\n const isRecapture = this.panel === 'recapture' && !!this.selectedItem\n\n try {\n this.loading = true\n this.loadingText = '동영상 프레임 추출 중...'\n\n let newPhotos: { file: File; url: string; setIndex: number }[] = []\n const imageShots: number[] = [] // 사진마다 어느 촬영(shot_no)의 것인지\n if (isRecapture) {\n if (!this.recaptureSet) {\n notify({ message: '재촬영 세트를 먼저 업로드해주세요.', level: 'warn' })\n return\n }\n this.recaptureBase = this.photos.length\n newPhotos = await this._fetchVlmFrames(this.recaptureSet, this.sets.length)\n } else {\n if (!this.uploadedSets.length) {\n notify({ message: '업로드된 촬영 세트가 없습니다.', level: 'warn' })\n return\n }\n // 촬영 칸 순서대로 — 비어 있는 칸은 건너뛰되 촬영번호는 가이드 것을 그대로 쓴다\n for (let i = 0; i < this.sets.length; i++) {\n const set = this.sets[i]\n if (!set) continue\n const frames = await this._fetchVlmFrames(set, i)\n const shotNo = this.guide?.shots?.[i]?.shot_no || i + 1\n for (const _ of frames) imageShots.push(shotNo)\n newPhotos = [...newPhotos, ...frames]\n }\n }\n\n const files = newPhotos.map(p => p.file)\n let checklist = isRecapture\n ? this.engineChecklist.filter(c => c.item_id === this.selectedItem.item_id)\n : this.engineChecklist\n\n // 아직 안 올라온 촬영에 배정된 항목은 이번 판정에서 뺀다.\n // 엔진은 그런 항목의 사진 범위를 비우는 대신 '전체 사진'을 주므로, 그냥 두면\n // 타설 후 항목이 배근 사진으로 판정된다 (배근·타설은 며칠 간격으로 찍는다).\n if (!isRecapture) {\n const pending = this._itemsAwaitingShot()\n if (pending.size) {\n checklist = checklist.filter(c => !pending.has(c.item_id))\n notify({\n message: `아직 촬영되지 않은 항목 ${pending.size}건은 이번 판정에서 제외했습니다. 해당 촬영을 올린 뒤 다시 실행하세요.`,\n level: 'warn'\n })\n }\n }\n\n // 촬영 배정 되돌리기 — 이걸 안 보내면 모든 항목이 모든 사진을 보게 되어\n // \"타설 후 항목이 배근 사진으로 판정되는\" 오판이 난다 (엔진 실증에서 실제 발생).\n // 배정된 촬영이 안 올라온 항목은 엔진이 hold 로 둔다 — 남의 사진으로 판정하지 않게.\n const shotItems = this._shotItemsMap()\n const scoping = !isRecapture && shotItems && imageShots.length === files.length\n\n // 항목을 나눠 여러 번 호출한다. 엔진이 한 번에 8개까지만 병렬 처리하는데,\n // 그 앞단 Cloudflare 가 100초에서 연결을 끊어 항목이 많으면 524 가 난다.\n const batches: any[][] = []\n for (let i = 0; i < checklist.length; i += INSPECT_BATCH) {\n batches.push(checklist.slice(i, i + INSPECT_BATCH))\n }\n\n let result: any = null\n for (let b = 0; b < batches.length; b++) {\n this.loadingText =\n batches.length > 1\n ? `AI 자동 판정 중... (${b + 1}/${batches.length} 묶음, 항목 ${batches[b].length}개)`\n : 'AI 자동 판정 중... (최대 1~2분 소요)'\n\n const input: any = { action: 'inspect', checklist: batches[b], input_kind: 'video_frames' }\n if (scoping) {\n input.image_shots = imageShots.join(',')\n input.shot_items = JSON.stringify(shotItems)\n }\n const part = await this._callEngine(input, files)\n result = result ? _mergeInspectResults(result, part) : part\n }\n\n if (isRecapture) {\n this.photos = [...this.photos, ...newPhotos]\n this._mergeItems(result?.items_sorted || result?.items || [], this.recaptureBase)\n this.recaptureSet = null\n } else {\n this.photos = newPhotos\n this.result = result\n }\n this.panel = 'none'\n this.selectedItem = null\n this.mainPhotoIndex = 0\n } catch (error) {\n console.error('AI 자동 판정 실패:', error)\n notify({ message: (error as Error).message, level: 'error' })\n } finally {\n this.loading = false\n }\n }\n\n /* 부분 재판정/측정 확정 결과를 기존 전체 결과에 병합하고 summary 재계산\n * - usedImageBase: used_images(부분집합 1-based) → 전체 프레임 인덱스 보정값 */\n private _mergeItems(updatedItems: any[], usedImageBase: number = 0) {\n const updated = updatedItems.map((it: any) => ({\n ...it,\n used_images: (it.used_images || []).map((n: number) => n + usedImageBase)\n }))\n const byId = new Map(updated.map((it: any) => [it.item_id, it]))\n const replace = (arr: any[]) => (arr || []).map(it => byId.get(it.item_id) || it)\n\n const items = replace(this.result?.items)\n const itemsSorted = this.result?.items_sorted ? replace(this.result.items_sorted) : undefined\n\n const summary: Record<string, number> = { pass: 0, fail: 0, hold: 0, pending: 0, error: 0, measure: 0 }\n for (const it of itemsSorted || items) {\n summary[it.verdict] = (summary[it.verdict] || 0) + 1\n if (it.verdict === 'pending' && it.pending_reason === 'measure') summary.measure += 1\n }\n summary.total = (itemsSorted || items).length\n\n this.result = { ...this.result, items, ...(itemsSorted ? { items_sorted: itemsSorted } : {}), summary }\n }\n\n private _resetAll() {\n this.objectUrls.forEach(u => URL.revokeObjectURL(u))\n this.objectUrls = []\n this.guide = null\n this.sets = []\n this.photos = []\n this.result = null\n this.panel = 'none'\n this.selectedItem = null\n this.mainPhotoIndex = 0\n this.recaptureBase = 0\n this.recaptureSet = null\n this._resetMeasureState()\n }\n\n private _resetMeasureState() {\n this.measureInputs = {}\n this.measureRunning = false\n this.measureMsg = ''\n this.measureResult = null\n this.measureImageUrl = ''\n this.thicknessFrames = []\n this.thicknessSlot = null\n this.thicknessFrameUrl = ''\n this.thicknessClick = null\n }\n\n /* ─── 패널 열기/닫기 ─── */\n private _openDetail(item: any) {\n const group = this._groupOf(item)\n // 재촬영/측정 항목은 상세 대신 해당 작업 패널을 바로 표시\n if (group === 'recapture') {\n this._openRecapture(item)\n return\n }\n if (group === 'measure') {\n this._openMeasure(item)\n return\n }\n this.selectedItem = item\n this.mainPhotoIndex = 0 // 선택 항목의 첫 사용 프레임부터 표시\n this.panel = 'detail'\n }\n\n private _openRecapture(item: any) {\n this.selectedItem = item\n this.recaptureSet = null\n this.panel = 'recapture'\n }\n\n private async _openMeasure(item: any) {\n this.selectedItem = item\n this._resetMeasureState()\n this.panel = 'measure'\n\n // 촬영 기술이 맞는 세트를 기본 선택 (④=04_cover, ⑤=05_thickness)\n const wantTech = item.measure?.model_id?.startsWith('rebar') ? '04_cover' : '05_thickness'\n const sets = this.uploadedSets\n const found = sets.findIndex(s => s.technique === wantTech)\n this.measureSetIndex = found >= 0 ? found : 0\n\n if (item.measure?.next_action === 'select_and_input') {\n await this._loadThicknessFrames()\n }\n }\n\n private async _onMeasureSetChange(index: number) {\n this.measureSetIndex = index\n this.measureResult = null\n this.measureImageUrl = ''\n if (this.selectedItem?.measure?.next_action === 'select_and_input') {\n this.thicknessSlot = null\n this.thicknessFrameUrl = ''\n this.thicknessClick = null\n await this._loadThicknessFrames()\n }\n }\n\n private _openReport = () => {\n this.panel = 'report'\n this.selectedItem = null\n this.expandedReportId = null\n // 리포트 패널이 우측 상단에 뜨므로 스크롤을 맨 위로 (판정 리스트는 자체 스크롤)\n this.updateComplete.then(() => {\n this.renderRoot.querySelector('div[body]')?.scrollTo({ top: 0, behavior: 'smooth' })\n this.renderRoot.querySelector('.items-pane')?.scrollTo({ top: 0, behavior: 'smooth' })\n })\n }\n\n /* 종합 리포트 항목 펼치기/접기 (한 번에 하나만 펼침) */\n private _toggleReportItem(id: string) {\n this.expandedReportId = this.expandedReportId === id ? null : id\n }\n\n private _closePanel = () => {\n this.panel = 'none'\n this.selectedItem = null\n }\n\n private _sortedItems(): any[] {\n return this.result?.items_sorted || this.result?.items || []\n }\n\n /* ─── ④ 철근 배근 길이 측정 (비동기 job + 진행률 폴링) ─── */\n private async _runRebarMeasure(item: any) {\n const set = this.uploadedSets[this.measureSetIndex]\n if (!set) {\n notify({ message: '측정할 촬영 세트가 없습니다.', level: 'warn' })\n return\n }\n const memberDim = parseFloat(this.measureInputs.member_dim_mm)\n const coverSpec = parseFloat(this.measureInputs.cover_spec_mm)\n if (!memberDim || !coverSpec) {\n notify({ message: '설계 단면 치수와 기준 피복두께를 입력해주세요. (도면값)', level: 'warn' })\n return\n }\n\n try {\n this.measureRunning = true\n this.measureMsg = '측정 시작...'\n this.measureResult = null\n this.measureImageUrl = ''\n\n const { job } = await this._callMeasure('/api/rebar/measure', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n set_id: set.setId,\n targets: [{ name: item.text || '측정 대상', member_dim_mm: memberDim, cover_spec_mm: coverSpec }]\n })\n })\n\n // 진행률 폴링 — msg는 서버가 주는 한국어 문구 그대로 표시\n let status: any\n do {\n await new Promise(r => setTimeout(r, 1500))\n status = await this._callMeasure(`/api/job/${job}`)\n this.measureMsg = status.msg || '측정 중...'\n } while (status.state !== 'done' && this.panel === 'measure')\n\n if (this.panel !== 'measure') return // 패널을 닫았으면 결과 무시\n const r = status.result || {}\n if (!r.ok) {\n notify({ message: r.why || '측정에 실패했습니다.', level: 'error' })\n // 실패 결과도 확정 가능(엔진이 hold로 변환) — 결과는 보관하되 이미지 없음\n this.measureResult = r\n return\n }\n this.measureResult = r\n // 측정에 쓴 프레임 중 가운데 프레임에 측정선 오버레이\n const frames = r.frames_used || []\n const overlayIdx = frames.length ? frames[Math.floor(frames.length / 2)] : 0\n try {\n this.measureImageUrl = await this._fetchMeasureImage(`/api/rebar/overlay/${job}/${overlayIdx}?w=1280`)\n } catch (e) {\n console.warn('오버레이 수신 실패:', e)\n }\n } catch (error) {\n console.error('철근 측정 실패:', error)\n notify({ message: (error as Error).message, level: 'error' })\n } finally {\n this.measureRunning = false\n this.measureMsg = ''\n }\n }\n\n /* ─── ⑤ 기둥·벽체 두께 측정 (프레임 선택 + 면 클릭, 동기) ─── */\n private async _loadThicknessFrames() {\n const set = this.uploadedSets[this.measureSetIndex]\n if (!set) return\n try {\n this.measureRunning = true\n this.measureMsg = '스윕에서 프레임 뽑는 중... (첫 호출은 10초쯤)'\n const data = await this._callMeasure(`/api/thickness/frames/${set.setId}`)\n const frames = (data.frames || []) as { slot: number; index: number }[]\n // 썸네일은 인증 때문에 fetch로 받아 blob URL로\n const withThumbs: { slot: number; index: number; thumbUrl?: string }[] = []\n for (const f of frames) {\n try {\n const thumbUrl = await this._fetchMeasureImage(`/api/thickness/frame/${set.setId}/${f.slot}?thumb=1`)\n withThumbs.push({ ...f, thumbUrl })\n } catch {\n withThumbs.push(f)\n }\n }\n this.thicknessFrames = withThumbs\n if (withThumbs.length) await this._selectThicknessFrame(withThumbs[Math.floor(withThumbs.length / 2)].slot)\n } catch (error) {\n console.error('프레임 목록 실패:', error)\n notify({ message: (error as Error).message, level: 'error' })\n } finally {\n this.measureRunning = false\n this.measureMsg = ''\n }\n }\n\n private async _selectThicknessFrame(slot: number) {\n const set = this.uploadedSets[this.measureSetIndex]\n if (!set) return\n this.thicknessSlot = slot\n this.thicknessClick = null\n try {\n this.thicknessFrameUrl = await this._fetchMeasureImage(`/api/thickness/frame/${set.setId}/${slot}`)\n } catch (error) {\n notify({ message: (error as Error).message, level: 'error' })\n }\n }\n\n /* 클릭 좌표를 표시 크기로 나눠 0~1 정규화 — 원본 해상도는 알 필요 없다 */\n private _onThicknessClick = (e: MouseEvent) => {\n if (this.measureRunning) return\n const rect = (e.target as HTMLElement).getBoundingClientRect()\n this.thicknessClick = {\n x: (e.clientX - rect.left) / rect.width,\n y: (e.clientY - rect.top) / rect.height\n }\n }\n\n private async _runThicknessMeasure(item: any) {\n const set = this.uploadedSets[this.measureSetIndex]\n if (!set || this.thicknessSlot === null || !this.thicknessClick) {\n notify({ message: '프레임을 고르고 잴 면을 탭해주세요.', level: 'warn' })\n return\n }\n\n try {\n this.measureRunning = true\n this.measureMsg = '측정 중... (여러 프레임 합의 측정, 30~40초)'\n this.measureResult = null\n this.measureImageUrl = ''\n\n const form = new FormData()\n form.append('set_id', set.setId)\n form.append('slot', String(this.thicknessSlot))\n form.append('x', String(this.thicknessClick.x))\n form.append('y', String(this.thicknessClick.y))\n if (this.measureInputs.design_mm) form.append('design_mm', this.measureInputs.design_mm)\n if (this.measureInputs.tol_mm) form.append('tol_mm', this.measureInputs.tol_mm)\n\n const r = await this._callMeasure('/api/thickness/measure', { method: 'POST', body: form })\n this.measureResult = r\n if (r.image_data) this.measureImageUrl = r.image_data\n if (!r.ok) notify({ message: r.summary || r.headline || '측정에 실패했습니다.', level: 'warn' })\n } catch (error) {\n console.error('두께 측정 실패:', error)\n notify({ message: (error as Error).message, level: 'error' })\n } finally {\n this.measureRunning = false\n this.measureMsg = ''\n }\n }\n\n /* ─── 측정 결과 → 판정 확정 (apply-measurement, OpenAI 미호출·즉시 응답) ─── */\n private async _applyMeasurement(item: any) {\n if (!this.measureResult) return\n try {\n this.loading = true\n this.loadingText = '판정 확정 중...'\n // 측정 서버 응답을 가공 없이 그대로 전달 — 품질 게이트/hold 승격은 엔진이 처리한다\n const result = await this._callEngine({\n action: 'apply-measurement',\n item: { item_id: item.item_id, text: item.text, category: item.category },\n model_id: item.measure?.model_id || this.measureResult.model_id,\n result: this.measureResult\n })\n\n const judged = { ...item, ...result.item }\n this._mergeItems([judged])\n // 확정 즉시 체크리스트에 기록한다. 「검사 등록」까지 미루면 그 사이에 화면을 벗어나거나\n // 재판정이 일어났을 때 측정 판정만 유실된다 (VLM 항목은 inspect 결과에 남아 있어 티가 안 남).\n await this._saveJudgments([judged])\n this._resetMeasureState()\n this.panel = 'none'\n this.selectedItem = null\n\n if (judged.verdict === 'hold') {\n notify({ message: '측정 품질이 기준에 못 미쳐 보류되었습니다. 재촬영을 권장합니다.', level: 'warn' })\n } else {\n notify({ message: `판정이 확정되었습니다: ${this._verdictLabel(judged)}` })\n }\n } catch (error) {\n console.error('판정 확정 실패:', error)\n notify({ message: (error as Error).message, level: 'error' })\n } finally {\n this.loading = false\n }\n }\n\n /* base64 data URL → File (측정 근거 이미지 첨부용) */\n private _dataUrlToFile(dataUrl: string, name: string): File | null {\n try {\n const [head, body] = dataUrl.split(',')\n const mime = head.match(/data:(.*?);/)?.[1] || 'image/jpeg'\n const bin = atob(body)\n const bytes = new Uint8Array(bin.length)\n for (let i = 0; i < bin.length; i++) bytes[i] = bin.charCodeAt(i)\n return new File([bytes], name, { type: mime })\n } catch {\n return null\n }\n }\n\n /* 적합/부적합으로 판정된 항목을 체크리스트의 감리자 확인란에 기록한다.\n 보류·미지원·오류는 미검사로 남긴다(자동으로 부적합 처리하지 않는다). */\n private async _saveJudgments(items: any[]) {\n const judged = items.filter(it => it.verdict === 'pass' || it.verdict === 'fail')\n if (!judged.length) return 0\n\n const response = await client.mutate({\n mutation: gql`\n mutation UpdateChecklistItemsAiJudgment($items: [ChecklistItemAiJudgment!]!) {\n updateChecklistItemsAiJudgment(items: $items)\n }\n `,\n variables: {\n items: judged.map(it => ({\n id: it.item_id,\n supervisoryConfirmStatus: it.verdict === 'pass' ? 'T' : 'F'\n }))\n }\n })\n if (response.errors) throw new Error(response.errors[0]?.message || '검사 결과 저장에 실패했습니다.')\n return judged.length\n }\n\n /* ─── 검사 등록: 감리자 판정 자동 반영 + AI판단 근거 첨부 ─── */\n private async _registerInspection() {\n const items = this._sortedItems()\n if (!items.length) {\n notify({ message: '판정 결과가 없습니다.', level: 'warn' })\n return\n }\n // 적합/부적합으로 자동 판정된 항목만 반영 (보류/미지원/오류는 미검사로 건너뜀)\n const judged = items.filter(it => it.verdict === 'pass' || it.verdict === 'fail')\n\n try {\n this.loading = true\n this.loadingText = '검사 결과 등록 중...'\n\n // 1) 감리자 적합/부적합 자동 채움 (적합/부적합 판정된 항목만, 없으면 건너뜀)\n await this._saveJudgments(items)\n\n // 2) 항목별 첨부: 판단 근거(AI판단 텍스트) + 근거 프레임/측정 근거 이미지\n // ai_report는 pending/error에서 빈 문자열로 오므로 그 항목은 첨부하지 않는다\n const attachments: any[] = []\n for (const it of items) {\n if (it.ai_report) {\n attachments.push({\n file: new File([it.ai_report], `AI판단_${(it.text || it.item_id).slice(0, 30)}.txt`, { type: 'text/plain' }),\n refBy: it.item_id,\n refType: 'ChecklistItem',\n description: 'AI판단'\n })\n }\n for (const n of it.used_images || []) {\n const photo = this.photos[n - 1]\n if (photo) {\n attachments.push({ file: photo.file, refBy: it.item_id, refType: 'ChecklistItem', description: 'AI판단' })\n }\n }\n // 측정 항목의 근거 이미지 (apply-measurement 응답의 base64)\n if (it.image_data) {\n const file = this._dataUrlToFile(it.image_data, `AI측정근거_${(it.text || it.item_id).slice(0, 30)}.jpg`)\n if (file) attachments.push({ file, refBy: it.item_id, refType: 'ChecklistItem', description: 'AI판단' })\n }\n }\n\n if (attachments.length) {\n const attachResponse = await client.mutate({\n mutation: gql`\n mutation CreateAttachments($attachments: [NewAttachment!]!) {\n createAttachments(attachments: $attachments) {\n id\n }\n }\n `,\n variables: { attachments },\n context: { hasUpload: true }\n })\n\n if (attachResponse.errors) throw new Error(attachResponse.errors[0]?.message || 'AI판단 자료 첨부에 실패했습니다.')\n }\n\n notify({ message: `검사 결과를 등록하였습니다. (자동 판정 ${judged.length}건 반영)` })\n\n // 등록 후 체크리스트 화면으로 이동\n navigate(`building-inspection-detail-checklist/${this.buildingInspectionId}`)\n } catch (error) {\n console.error('검사 등록 실패:', error)\n notify({ message: (error as Error).message, level: 'error' })\n } finally {\n this.loading = false\n }\n }\n}\n"]}
1
+ {"version":3,"file":"building-inspection-detail-ai-measurement.js","sourceRoot":"","sources":["../../../client/pages/building-inspection/building-inspection-detail-ai-measurement.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * 검측 관리 상세 - AI 자동 검측 (동영상 세트 + 측정 모델 2종)\n *\n * 체크리스트 항목을 AI 엔진(inspection-ai)과 측정 서버(measure-engine)에 연동해:\n * 1) 촬영 가이드(plan-shots, 동영상 최대 3건)를 표시하고\n * 2) LidarInspector 앱이 만든 세트(video.mov/poses.jsonl/meta.json)를 업로드하면\n * 3) 세트별 대표 3프레임으로 자동 판정(inspect, input_kind=video_frames)을 실행한 뒤\n * 4) 「추가 작업 필요」(재촬영/기준값 입력/AI 미지원)를 분류해 측정 UI(철근 배근 길이·기둥벽체 두께)로 처리하고\n * 5) 측정 결과는 apply-measurement로 판정 확정 → 검사 등록 시 감리자 적합/부적합 자동 반영 + 근거 첨부한다.\n */\nimport '@material/web/icon/icon.js'\nimport '@material/web/progress/circular-progress.js'\n\nimport gql from 'graphql-tag'\nimport { css, html } from 'lit'\nimport { customElement, state, query } from 'lit/decorators.js'\n\nimport { PageView, navigate } from '@operato/shell'\nimport { ScrollbarStyles } from '@operato/styles'\nimport { PageLifecycle } from '@operato/shell/dist/src/app/pages/page-view'\nimport { client } from '@operato/graphql'\nimport { notify } from '@operato/layout'\nimport { canDcspMutate } from '@dssp/building-complex/dist-client/utils/privilege'\n\nimport './component/building-inspection-detail-header'\n\nconst ENGINE_BASE_URL = 'https://hatiolab-korea-uni.nruing.com'\nconst ENGINE_RUN_URL = `${ENGINE_BASE_URL}/api/run/inspection-ai`\nconst ENGINE_AUTH = `Basic ${btoa('admin:admin1234')}`\n/* 측정 서버(measure-engine/server.py). 배포 시 실제 주소로 수정 — https 페이지에서는 https(리버스 프록시) 필요 */\nconst MEASURE_BASE_URL = 'https://hatiolab-korea-uni.nruing.com/measure'\nconst MEASURE_AUTH = ENGINE_AUTH\n\n/* 촬영 안내 이미지 (엔진 전달물 고정 그림 + 픽토그램) */\nconst captureGuideImg = new URL('../../assets/ai-measurement/capture_guide.png', import.meta.url).href\nconst pictoRebarImg = new URL('../../assets/ai-measurement/picto-rebar-parallel.svg', import.meta.url).href\nconst pictoMemberImg = new URL('../../assets/ai-measurement/picto-member-corner.svg', import.meta.url).href\n\n/* 세트 폴더 필수 파일 (LidarInspector 앱이 촬영 1회당 생성) */\nconst SET_FILES = ['video.mov', 'poses.jsonl', 'meta.json']\n\n/* 촬영 앱 실행 링크 — iPad에서 이 화면을 열었을 때 앱이 바로 촬영 화면으로 뜬다.\n server 파라미터로 업로드 주소까지 넘겨서 앱 설정을 따로 안 만져도 되게 한다.\n return 파라미터를 주면 앱이 업로드를 마친 뒤 이 화면으로 돌아온다(?set_id=... 가 붙어서 온다). */\nfunction appCaptureLink(tech: 'cover' | 'thick') {\n return (\n `gamri://${tech}?server=${encodeURIComponent(MEASURE_BASE_URL)}` +\n `&return=${encodeURIComponent(location.href)}`\n )\n}\n\n/* 한 번의 /inspect 에 보낼 검사항목 수. 엔진이 8개까지만 병렬 처리하고, 그 앞단\n Cloudflare 가 100초에서 끊기 때문에(524) 항목이 많으면 나눠 보내야 한다. */\nconst INSPECT_BATCH = 8\n\n/* 나눠 호출한 /inspect 결과 합치기 — 항목 배열만 이어 붙이고 요약은 다시 센다 */\nfunction _mergeInspectResults(a: any, b: any) {\n const items = [...(a.items || []), ...(b.items || [])]\n const itemsSorted =\n a.items_sorted || b.items_sorted ? [...(a.items_sorted || a.items || []), ...(b.items_sorted || b.items || [])] : undefined\n\n const summary: Record<string, number> = { pass: 0, fail: 0, hold: 0, pending: 0, error: 0, measure: 0 }\n for (const it of items) {\n summary[it.verdict] = (summary[it.verdict] || 0) + 1\n if (it.verdict === 'pending' && it.pending_reason === 'measure') summary.measure += 1\n }\n summary.total = items.length\n\n return { ...a, ...b, items, ...(itemsSorted ? { items_sorted: itemsSorted } : {}), summary }\n}\n\n/* KCS 기준은 매칭 결과 JSON(kcs_matches[0])으로 저장돼 있다 → 엔진에 보낼 조문 텍스트로 편다.\n 문서/조항 라벨을 앞에 붙여야 모델이 어느 기준을 인용하는지 reason 에 쓸 수 있다. */\nfunction _kcsCriteriaText(raw?: string) {\n if (!raw) return ''\n try {\n const kcs = JSON.parse(raw)\n const label = [kcs.file_label, kcs.clause_no, kcs.clause_title].filter(Boolean).join(' ')\n const body = (kcs.matched_item || kcs.text || '').trim()\n return body ? `${label}\\n${body}`.trim() : label\n } catch {\n return raw.trim() // 구형 데이터(문자열 그대로 저장된 경우)\n }\n}\n\n/* set_id(YYYYmmdd-HHMMSS_xxxxxx) → \"9/11 14:30\" 표기 */\nfunction _setTimeLabel(setId: string) {\n const m = /^(\\d{4})(\\d{2})(\\d{2})-(\\d{2})(\\d{2})/.exec(setId || '')\n return m ? `${Number(m[2])}/${Number(m[3])} ${m[4]}:${m[5]}` : setId\n}\n\n/* 엔진 verdict(기계값) → 화면 라벨. pass/fail만 합/불로 자동 체크, 나머지는 감리자 판단 */\nconst VERDICT_LABEL = {\n pass: '적합',\n fail: '부적합',\n hold: '재촬영 필요',\n pending: 'AI 미지원',\n error: '분석 오류'\n}\n\n/* 엔진 routing(기계값) → 화면 라벨. cv 계열은 CV팀 명세 고정 문구 \"3D 계측\" */\nconst ROUTING_LABEL = {\n vlm: 'AI 사진판독',\n cv: '3D 계측',\n cv_missing: '3D 계측'\n}\n\n/* operator_inputs 필드 키 → 한글 라벨 (모르는 키는 키 그대로 노출) */\nconst FIELD_LABEL = {\n name: '부재/변 이름',\n member_dim_mm: '설계 단면 치수 (mm)',\n cover_spec_mm: '기준(최소) 피복두께 (mm)',\n design_mm: '설계 두께 (mm)',\n tol_mm: '허용 공차 ± (mm)'\n}\n\ntype PanelMode = 'none' | 'detail' | 'recapture' | 'measure' | 'report'\n\ntype SetInfo = {\n setId: string\n technique?: string\n label: string\n warnings: string[]\n}\n\n@customElement('building-inspection-detail-ai-measurement')\nexport class BuildingInspectionAiMeasurement extends PageView {\n static styles = [\n ScrollbarStyles,\n css`\n :host {\n display: grid;\n grid-template-rows: 75px 1fr;\n color: #4e5055;\n width: 100%;\n height: 100%;\n background-color: #f7f7f7;\n }\n\n * {\n box-sizing: border-box;\n }\n\n div[body] {\n display: flex;\n flex-direction: column;\n min-height: 0;\n overflow-y: auto;\n padding: var(--spacing-medium);\n gap: 12px;\n }\n\n .page-title {\n text-align: center;\n font-size: 16px;\n font-weight: 700;\n color: #333;\n }\n\n .page-title span[target] {\n color: #7d2f2f;\n text-decoration: underline;\n }\n\n /* ─── 1단계: 촬영 가이드 ─── */\n .guide-container {\n max-width: 560px;\n width: 100%;\n margin: 0 auto;\n display: flex;\n flex-direction: column;\n gap: 14px;\n }\n\n .step-badge {\n align-self: flex-start;\n background: #f7e9e9;\n color: #7d2f2f;\n font-size: 12px;\n font-weight: 700;\n padding: 4px 10px;\n border-radius: 12px;\n }\n\n .guide-title {\n font-size: 26px;\n font-weight: 800;\n color: #222;\n line-height: 1.3;\n white-space: pre-line;\n }\n\n .guide-desc {\n font-size: 13px;\n color: #777;\n }\n\n .card {\n background: #fff;\n border: 1px solid #e5e5e5;\n border-radius: 10px;\n padding: 16px;\n }\n\n .card h4 {\n margin: 0 0 10px 0;\n font-size: 14px;\n color: #333;\n }\n\n .card ul {\n margin: 0;\n padding-left: 4px;\n list-style: none;\n display: flex;\n flex-direction: column;\n gap: 8px;\n }\n\n .card ul li {\n font-size: 13px;\n color: #555;\n display: flex;\n gap: 8px;\n }\n\n .card ul li::before {\n content: '';\n flex-shrink: 0;\n width: 6px;\n height: 6px;\n border-radius: 50%;\n background: #7d2f2f;\n margin-top: 6px;\n }\n\n /* 촬영 안내 그림 — 픽토그램은 배경 투명·짙은 글자라 밝은 카드 위에만 얹는다 */\n .capture-guide-img {\n width: 100%;\n border-radius: 8px;\n display: block;\n }\n\n /* 촬영 앱 실행 링크 */\n .app-links {\n display: flex;\n align-items: center;\n gap: 8px;\n flex-wrap: wrap;\n font-size: 12px;\n color: #777;\n }\n\n /* 촬영 칸의 「앱으로 촬영」 */\n .shoot-link {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n flex-shrink: 0;\n padding: 7px 12px;\n border-radius: 999px;\n background: #7d2f2f;\n color: #fff;\n font-size: 12px;\n font-weight: 600;\n text-decoration: none;\n }\n\n .shoot-link md-icon {\n --md-icon-size: 16px;\n color: #fff;\n }\n\n .app-links a {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 6px 12px;\n border: 1px solid #7d2f2f;\n border-radius: 999px;\n color: #7d2f2f;\n font-size: 12px;\n font-weight: 600;\n text-decoration: none;\n }\n\n /* 앱이 올린 세트 고르기 */\n .set-chooser {\n border: 1px solid #e5e5e5;\n border-radius: 8px;\n background: #fff;\n margin: -4px 0 4px 38px;\n padding: 6px;\n max-height: 220px;\n overflow-y: auto;\n }\n\n .chooser-row {\n display: block;\n width: 100%;\n text-align: left;\n border: 0;\n background: transparent;\n border-radius: 6px;\n padding: 8px 10px;\n cursor: pointer;\n font-size: 12px;\n color: #666;\n }\n\n .chooser-row:hover {\n background: #f5f5f5;\n }\n\n .chooser-row b {\n display: block;\n font-size: 13px;\n color: #333;\n }\n\n .chooser-empty {\n padding: 12px 10px;\n font-size: 12px;\n color: #999;\n }\n\n .chooser-actions {\n display: flex;\n justify-content: flex-end;\n gap: 4px;\n border-top: 1px solid #f0f0f0;\n padding-top: 4px;\n }\n\n .set-chooser .app-links {\n border-top: 1px solid #f0f0f0;\n padding: 8px 4px 6px;\n }\n\n /* 세트 업로드 카드 */\n .set-card {\n display: flex;\n align-items: center;\n gap: 10px;\n border: 1px dashed #ccc;\n border-radius: 8px;\n background: #fafafa;\n padding: 12px;\n cursor: pointer;\n }\n\n .set-card[uploaded] {\n border-style: solid;\n border-color: #bfd8bf;\n background: #f2f8f2;\n cursor: default;\n }\n\n .set-card md-icon {\n --md-icon-size: 28px;\n color: #b5b5b5;\n flex-shrink: 0;\n }\n\n .set-card[uploaded] md-icon {\n color: #2e7d32;\n }\n\n .set-card .set-main {\n flex: 1;\n min-width: 0;\n font-size: 13px;\n color: #555;\n }\n\n .set-card .set-main b {\n display: block;\n color: #333;\n margin-bottom: 2px;\n }\n\n .set-card .set-warn {\n font-size: 11px;\n color: #b7791f;\n }\n\n .progress-row {\n display: flex;\n justify-content: space-between;\n align-items: center;\n font-size: 13px;\n color: #555;\n font-weight: 600;\n }\n\n .progress-bar {\n height: 6px;\n border-radius: 3px;\n background: #eee;\n overflow: hidden;\n }\n\n .progress-bar div {\n height: 100%;\n background: #7d2f2f;\n transition: width 0.3s;\n }\n\n .primary-button {\n width: 100%;\n border: none;\n border-radius: 8px;\n background: #7d2f2f;\n color: #fff;\n font-size: 16px;\n font-weight: 700;\n padding: 14px;\n cursor: pointer;\n }\n\n .primary-button:disabled {\n background: #ccc;\n cursor: default;\n }\n\n .text-button {\n border: 1px solid #ddd;\n border-radius: 8px;\n background: #fff;\n color: #555;\n font-size: 13px;\n padding: 8px 14px;\n cursor: pointer;\n }\n\n input[type='file'] {\n display: none;\n }\n\n /* ─── 2단계: 판정 결과 ─── */\n /* 결과 화면은 높이를 화면에 고정하고 컬럼(프레임/판정 리스트/상세)별로 내부 스크롤 */\n .result-body {\n display: flex;\n gap: 14px;\n flex: 1;\n min-height: 0;\n }\n\n .photo-pane {\n flex: 1.1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n gap: 8px;\n }\n\n .photo-pane .caption {\n text-align: center;\n font-size: 12px;\n color: #999;\n }\n\n .photo-main {\n border-radius: 10px;\n overflow: hidden;\n background: #000;\n display: flex;\n justify-content: center;\n max-height: 480px;\n }\n\n .photo-main img {\n max-width: 100%;\n max-height: 480px;\n object-fit: contain;\n }\n\n .photo-thumbs {\n display: flex;\n gap: 8px;\n overflow-x: auto;\n padding-bottom: 4px;\n }\n\n .photo-thumbs img {\n width: 96px;\n height: 72px;\n object-fit: cover;\n border-radius: 6px;\n cursor: pointer;\n border: 2px solid transparent;\n }\n\n .photo-thumbs img[selected] {\n border-color: #7d2f2f;\n }\n\n .items-pane {\n flex: 1.4;\n min-width: 0;\n display: flex;\n flex-direction: column;\n gap: 10px;\n overflow-y: auto;\n padding-right: 4px;\n }\n\n .photo-pane,\n .side-pane {\n overflow-y: auto;\n }\n\n .summary-banner {\n background: #f7e9e9;\n border: 1px solid #eedada;\n color: #7d2f2f;\n font-size: 13px;\n font-weight: 700;\n border-radius: 8px;\n padding: 10px 14px;\n }\n\n .group-title {\n font-size: 14px;\n font-weight: 700;\n color: #333;\n margin-top: 4px;\n }\n\n .group-subtitle {\n font-size: 12px;\n font-weight: 700;\n color: #777;\n margin: 2px 0 0 4px;\n }\n\n .item-card {\n display: flex;\n gap: 10px;\n align-items: flex-start;\n background: #fff;\n border: 1px solid #e5e5e5;\n border-radius: 10px;\n padding: 12px;\n cursor: pointer;\n }\n\n .item-card[selected] {\n border-color: #7d2f2f;\n box-shadow: 0 0 0 1px #7d2f2f inset;\n }\n\n .item-no {\n flex-shrink: 0;\n width: 24px;\n height: 24px;\n border-radius: 50%;\n background: #7d2f2f;\n color: #fff;\n font-size: 12px;\n font-weight: 700;\n display: flex;\n justify-content: center;\n align-items: center;\n }\n\n .item-main {\n flex: 1;\n min-width: 0;\n }\n\n .item-name {\n font-size: 14px;\n font-weight: 700;\n color: #222;\n margin-bottom: 4px;\n }\n\n .item-desc {\n font-size: 12px;\n color: #777;\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n }\n\n .chip {\n display: inline-block;\n font-size: 11px;\n font-weight: 700;\n border-radius: 4px;\n padding: 2px 6px;\n margin-right: 6px;\n background: #eef2f7;\n color: #3f71a0;\n }\n\n .chip-verdict {\n font-size: 12px;\n font-weight: 700;\n color: #555;\n }\n\n .badge {\n flex-shrink: 0;\n font-size: 12px;\n font-weight: 700;\n border-radius: 14px;\n padding: 5px 12px;\n white-space: nowrap;\n }\n\n .badge[pass] {\n background: #e8f5e9;\n color: #2e7d32;\n }\n\n .badge[fail] {\n background: #fdecea;\n color: #c62828;\n }\n\n .badge[etc] {\n background: #fff8e1;\n color: #b7791f;\n }\n\n .capture-button {\n flex-shrink: 0;\n border: none;\n border-radius: 14px;\n background: #fff3e0;\n color: #b7791f;\n font-size: 12px;\n font-weight: 700;\n padding: 6px 12px;\n cursor: pointer;\n }\n\n .measure-button {\n flex-shrink: 0;\n border: none;\n border-radius: 14px;\n background: #e8eef7;\n color: #2f5d8a;\n font-size: 12px;\n font-weight: 700;\n padding: 6px 12px;\n cursor: pointer;\n }\n\n /* ─── 우측 패널 (상세/재촬영/측정/리포트) ─── */\n .side-pane {\n flex: 1;\n min-width: 300px;\n max-width: 400px;\n background: #fff;\n border: 1px solid #e5e5e5;\n border-radius: 10px;\n padding: 16px;\n display: flex;\n flex-direction: column;\n gap: 12px;\n }\n\n .side-pane h3 {\n margin: 0;\n font-size: 16px;\n color: #222;\n }\n\n .detail-header {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .detail-header h3 {\n font-size: 18px;\n }\n\n .detail-summary {\n font-size: 12px;\n color: #555;\n line-height: 1.7;\n white-space: pre-line;\n border-bottom: 1px solid #f0f0f0;\n padding-bottom: 10px;\n }\n\n .kv-grid {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 10px;\n }\n\n .kv {\n display: flex;\n flex-direction: column;\n gap: 2px;\n border: 1px solid #eee;\n border-radius: 8px;\n padding: 10px 12px;\n background: #fff;\n }\n\n .kv label {\n font-size: 11px;\n color: #999;\n }\n\n .kv span {\n font-size: 15px;\n font-weight: 700;\n color: #333;\n }\n\n .kv .verdict-value[pass] {\n color: #2e7d32;\n }\n\n .kv .verdict-value[fail] {\n color: #c62828;\n }\n\n .reason-box {\n display: flex;\n flex-direction: column;\n gap: 10px;\n font-size: 12px;\n line-height: 1.7;\n }\n\n .reason-verdict {\n border-left: 3px solid #7d2f2f;\n background: #fdf6f6;\n color: #333;\n padding: 8px 10px;\n }\n\n .evidence-img {\n width: 100%;\n border-radius: 8px;\n border: 1px solid #eee;\n }\n\n .why-box {\n background: #fff8e1;\n border: 1px solid #f4e4b5;\n border-radius: 8px;\n padding: 10px;\n font-size: 12px;\n color: #7a5c14;\n line-height: 1.6;\n }\n\n /* 측정 패널 */\n .measure-field {\n display: flex;\n flex-direction: column;\n gap: 4px;\n font-size: 12px;\n color: #555;\n }\n\n .measure-field input,\n .measure-field select {\n padding: 9px 10px;\n border: 1px solid #ccc;\n border-radius: 6px;\n font-size: 14px;\n }\n\n .measure-msg {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 13px;\n color: #7d2f2f;\n font-weight: 600;\n }\n\n .measure-msg md-circular-progress {\n --md-circular-progress-size: 22px;\n }\n\n .frame-strip {\n display: flex;\n gap: 6px;\n overflow-x: auto;\n padding-bottom: 4px;\n }\n\n .frame-strip img {\n height: 60px;\n border-radius: 6px;\n border: 2px solid transparent;\n cursor: pointer;\n opacity: 0.7;\n }\n\n .frame-strip img[selected] {\n border-color: #7d2f2f;\n opacity: 1;\n }\n\n .click-stage {\n position: relative;\n line-height: 0;\n }\n\n .click-stage img {\n width: 100%;\n border-radius: 8px;\n cursor: crosshair;\n }\n\n .click-dot {\n position: absolute;\n width: 24px;\n height: 24px;\n margin: -12px 0 0 -12px;\n border: 3px solid #ffd400;\n border-radius: 50%;\n pointer-events: none;\n }\n\n .measure-summary {\n background: #f7f7f7;\n border-radius: 8px;\n padding: 10px;\n font-size: 12px;\n color: #333;\n line-height: 1.7;\n white-space: pre-line;\n }\n\n .report-counts {\n display: flex;\n text-align: center;\n border: 1px solid #eee;\n border-radius: 8px;\n overflow: hidden;\n }\n\n .report-counts div {\n flex: 1;\n padding: 10px 0;\n }\n\n .report-counts b {\n display: block;\n font-size: 20px;\n }\n\n .report-counts small {\n font-size: 11px;\n color: #888;\n }\n\n .report-counts div[pass] b {\n color: #2e7d32;\n }\n\n .report-counts div[fail] b {\n color: #c62828;\n }\n\n .report-counts div[etc] b {\n color: #b7791f;\n }\n\n .report-item {\n border-bottom: 1px solid #f0f0f0;\n font-size: 13px;\n color: #333;\n }\n\n .report-head {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 10px 0;\n cursor: pointer;\n }\n\n .report-head .report-text {\n flex: 1;\n min-width: 0;\n }\n\n .report-caret {\n --md-icon-size: 20px;\n color: #999;\n transition: transform 0.2s;\n }\n\n .report-caret[open] {\n transform: rotate(180deg);\n }\n\n .report-basis {\n display: flex;\n flex-direction: column;\n gap: 6px;\n font-size: 12px;\n color: #555;\n background: #f7f7f7;\n border-radius: 6px;\n padding: 10px;\n margin: 0 0 10px 0;\n }\n\n .report-basis .report-ai {\n white-space: pre-line;\n color: #333;\n }\n\n .report-basis .report-used {\n color: #888;\n }\n\n .report-item .verdict {\n font-weight: 700;\n flex-shrink: 0;\n }\n\n .report-item .verdict[pass] {\n color: #2e7d32;\n }\n\n .report-item .verdict[fail] {\n color: #c62828;\n }\n\n .report-item .verdict[etc] {\n color: #b7791f;\n }\n\n /* ─── 로딩 오버레이 ─── */\n .loading-overlay {\n position: fixed;\n inset: 0;\n background: rgba(0, 0, 0, 0.5);\n display: flex;\n justify-content: center;\n align-items: center;\n z-index: 2000;\n }\n\n .loading-overlay .box {\n background: #fff;\n padding: 32px 48px;\n border-radius: 12px;\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 12px;\n font-size: 14px;\n color: #555;\n }\n\n .empty-state {\n text-align: center;\n color: #999;\n font-size: 14px;\n padding: 60px 0;\n }\n `\n ]\n\n @state() project: any = {}\n @state() buildingInspection: any = {}\n @state() buildingInspectionId: string = ''\n\n @state() guide: any = null // plan-shots 응답 {shots, total_shots, markdown}\n @state() sets: (SetInfo | null)[] = [] // 촬영 건별 업로드된 세트 (shots 순서)\n @state() photos: { file: File; url: string; setIndex: number }[] = [] // inspect에 보낸 대표 프레임(표시/첨부용)\n @state() result: any = null // inspect 응답\n @state() mainPhotoIndex: number = 0\n\n @state() panel: PanelMode = 'none'\n @state() selectedItem: any = null\n @state() recaptureBase: number = 0 // 재검사 진입 시점의 프레임 수 (used_images 보정용)\n @state() recaptureSet: SetInfo | null = null // 재촬영으로 새로 올린 세트\n @state() setPickerFor: number | null = null // 세트 고르는 중인 촬영 번호 (-1 = 재촬영)\n @state() recentSets: any[] = [] // 측정 서버에 올라온 최근 세트 (앱이 촬영 직후 자동 전송)\n @state() recentLoading: boolean = false\n private autoAttachSince: number = 0 // 이 시각(초) 이후 업로드된 세트만 자동 등록\n @state() expandedReportId: string | null = null // 종합 리포트에서 펼친 항목(아코디언)\n\n /* 측정 패널 상태 */\n @state() measureSetIndex: number = 0\n @state() measureInputs: Record<string, string> = {}\n @state() measureRunning: boolean = false\n @state() measureMsg: string = ''\n @state() measureResult: any = null // 측정 서버 원본 응답 — apply-measurement에 가공 없이 전달\n @state() measureImageUrl: string = '' // 근거 이미지(오버레이/결과사진)\n @state() thicknessFrames: { slot: number; index: number; thumbUrl?: string }[] = []\n @state() thicknessSlot: number | null = null\n @state() thicknessFrameUrl: string = ''\n @state() thicknessClick: { x: number; y: number } | null = null\n\n @state() loading: boolean = false\n @state() loadingText: string = ''\n /** 뮤테이션 가능 여부('dcsp guest' 권한 보유 시 false) — 게스트에게는 생성/수정/삭제 버튼을 숨긴다 */\n @state() private canMutate = false\n\n @query('#setInput') private setInputEl!: HTMLInputElement\n\n /* 세트 업로드 대상: 촬영 건 인덱스(가이드 화면) 또는 -1(재촬영 패널) */\n private pendingSetIndex: number | null = null\n private objectUrls: string[] = [] // 페이지 이탈 시 정리할 blob URL들\n\n /* 촬영 앱에 다녀온 뒤 화면이 다시 보이면 올라온 세트를 찾아 자동 등록한다 */\n private _onVisible = () => {\n if (document.visibilityState === 'visible' && this.guide && !this.result) this._autoAttachTaggedSets()\n }\n\n async connectedCallback() {\n super.connectedCallback()\n document.addEventListener('visibilitychange', this._onVisible)\n this.canMutate = await canDcspMutate()\n this.updateContext()\n }\n\n disconnectedCallback() {\n document.removeEventListener('visibilitychange', this._onVisible)\n super.disconnectedCallback()\n }\n\n get context() {\n return {\n title: '검측 관리 상세 - AI 자동 검측'\n }\n }\n\n /* 엔진에 보낼 검측요청서: 체크리스트 항목 → {item_id, category, text} */\n get engineChecklist() {\n const items = this.buildingInspection?.checklist?.checklistItems || []\n return [...items]\n .filter(item => (item.name || '').trim()) // 이름 없는 항목은 검측 불가 — 엔진 검증 실패 방지\n .sort((a, b) => (a.sequence || 0) - (b.sequence || 0))\n .map(item => ({\n item_id: item.id,\n category: [item.mainType, item.detailType].filter(Boolean).join(' · '),\n text: item.name || '',\n // 검사 기준은 조문 '번호'가 아니라 본문을 보내야 판정 근거가 실제 기준에 붙는다.\n // (조문 번호만 주면 모델이 그 내용을 모르는 상태로 판단한다 — 엔진 안내)\n criteria_kcs: _kcsCriteriaText(item.kcsCriteria),\n criteria_site: (item.siteSpecCriteria || '').trim()\n }))\n }\n\n get uploadedSets(): SetInfo[] {\n return this.sets.filter((s): s is SetInfo => !!s)\n }\n\n render() {\n return html`\n <building-inspection-detail-header\n .buildingInspectionId=${this.buildingInspection?.id}\n .buildingLevelId=${this.buildingInspection?.buildingLevel?.id}\n .projectName=${this.project.name}\n .buildingName=${this.buildingInspection?.buildingLevel?.building?.name}\n .buildingLevelFloor=${this.buildingInspection?.buildingLevel?.floor}\n .projectId=${this.project.id}\n ></building-inspection-detail-header>\n\n <div body>\n <div class=\"page-title\">\n AI 자동 검측 – ${this.buildingInspection?.checklist?.location || ''}\n <span target>${this.buildingInspection?.checklist?.name || ''}</span>\n </div>\n\n ${this.result ? this._renderResult() : this._renderGuide()}\n </div>\n\n <!-- 세트 파일 선택: video.mov/poses.jsonl/meta.json 3개 멀티선택 또는 zip 1개.\n accept을 두지 않는다 — iOS는 확장자를 UTI로 바꿔 거르는데 .jsonl은 매핑이 없어\n 파일 앱에서 poses.jsonl이 비활성으로 보인다. 파일명 검증은 아래 핸들러가 한다. -->\n <input id=\"setInput\" type=\"file\" multiple @change=${this._onSetFilesSelected} />\n\n ${\n this.loading\n ? html`\n <div class=\"loading-overlay\">\n <div class=\"box\">\n <md-circular-progress indeterminate></md-circular-progress>\n <span>${this.loadingText}</span>\n </div>\n </div>\n `\n : ''\n }\n `\n }\n\n /* ─── 1단계: 촬영 가이드 + 세트 업로드 화면 ─── */\n private _renderGuide() {\n if (!this.guide) {\n return html`<div class=\"empty-state\">촬영 가이드를 준비 중입니다...</div>`\n }\n\n const shots = this.guide.shots || []\n const total = this.guide.total_shots || shots.length\n const uploaded = this.uploadedSets.length\n const current = shots[Math.min(uploaded, shots.length - 1)]\n const done = uploaded >= total\n\n return html`\n <div class=\"guide-container\">\n <div class=\"step-badge\">동영상 ${Math.min(uploaded + 1, total)}/${total} · ${current?.target || '촬영'}</div>\n <div class=\"guide-title\">${current?.target || ''}${done ? ' 촬영 완료' : ''}</div>\n <div class=\"guide-desc\">\n 전용 촬영 앱(LidarInspector)으로 동영상을 촬영한 뒤, 앱이 만든 파일 3개(video.mov·poses.jsonl·meta.json)를 촬영 건마다\n 업로드해주세요. 일반 카메라 동영상은 사용할 수 없습니다.\n </div>\n\n <div class=\"card\">\n <h4>촬영 가이드 (동영상 ${total}건)</h4>\n <ul>\n ${shots.map(s => html`<li>촬영 ${s.shot_no || ''} · ${s.target} — ${s.how}</li>`)}\n </ul>\n </div>\n\n <div class=\"card\">\n <h4>공통 촬영법 — 옆으로 이동 · 대상 정면 유지 · 대상 전체 포함</h4>\n <img class=\"capture-guide-img\" src=${captureGuideImg} alt=\"촬영 안내\" />\n </div>\n\n <div class=\"card\" style=\"display: flex; flex-direction: column; gap: 10px;\">\n <div class=\"progress-row\">\n <span>촬영 세트 업로드</span>\n <span>${uploaded} / ${total}</span>\n </div>\n <div class=\"progress-bar\"><div style=\"width: ${total ? (uploaded / total) * 100 : 0}%\"></div></div>\n ${shots.map((s, i) => {\n const set = this.sets[i]\n return html`\n <div class=\"set-card\" ?uploaded=${!!set} @click=${() => !set && this._openSetChooser(i)}>\n <md-icon>${set ? 'check_circle' : 'video_file'}</md-icon>\n <div class=\"set-main\">\n <b>촬영 ${s.shot_no || i + 1} · ${s.target}</b>\n ${\n set\n ? html`세트 연결 완료 (${set.setId}) ${set.warnings.map(w => html`<div class=\"set-warn\">⚠ ${w}</div>`)}`\n : html`「앱으로 촬영」을 누르면 촬영 후 이 칸에 자동 등록됩니다 · 탭하면 직접 선택`\n }\n </div>\n ${\n set\n ? html`<button\n class=\"text-button\"\n @click=${(e: Event) => {\n e.stopPropagation()\n this._openSetChooser(i)\n }}\n >\n 교체\n </button>`\n : html`<a class=\"shoot-link\" href=${this._shotAppLink(s, i)} @click=${(e: Event) => e.stopPropagation()}>\n <md-icon>photo_camera</md-icon>앱으로 촬영\n </a>`\n }\n </div>\n ${this.setPickerFor === i ? this._renderSetChooser(i) : ''}\n `\n })}\n </div>\n\n <button class=\"primary-button\" ?disabled=${uploaded === 0} @click=${() => this._runInspection()}>\n AI 자동 판정 실행 ${uploaded ? `(세트 ${uploaded}/${total})` : ''}\n </button>\n </div>\n `\n }\n\n /* ─── 2단계: 판정 결과 화면 ─── */\n\n /* 항목 그룹: auto(판정완료) / recapture(재촬영) / measure(기준값 입력) / manual(AI 미지원·오류) */\n private _groupOf(item: any): 'auto' | 'recapture' | 'measure' | 'manual' {\n if (item.verdict === 'pass' || item.verdict === 'fail') return 'auto'\n if (item.verdict === 'hold') return 'recapture'\n if (item.verdict === 'pending' && item.pending_reason === 'measure') return 'measure'\n return 'manual'\n }\n\n /* verdict → 화면 라벨 (pending은 pending_reason으로 세분) */\n private _verdictLabel(item: any): string {\n if (item.verdict === 'pending') {\n return item.pending_reason === 'measure' ? '기준값 입력 필요' : 'AI 미지원'\n }\n return VERDICT_LABEL[item.verdict] || item.verdict\n }\n\n private _renderResult() {\n const items = this._sortedItems()\n const autoItems = items.filter(it => this._groupOf(it) === 'auto')\n const recaptureItems = items.filter(it => this._groupOf(it) === 'recapture')\n const measureItems = items.filter(it => this._groupOf(it) === 'measure')\n const manualItems = items.filter(it => this._groupOf(it) === 'manual')\n const moreCount = recaptureItems.length + measureItems.length + manualItems.length\n\n // 클릭한 항목의 used_images만 표시 (선택 없으면 전체 항목 합집합). used_images는 전체 프레임 기준 1-based\n const focusItems = this.selectedItem ? [this.selectedItem] : items\n const usedNos = new Set<number>()\n for (const it of focusItems) for (const n of it.used_images || []) usedNos.add(n)\n const usedPhotos = this.photos.map((photo, i) => ({ photo, no: i + 1 })).filter(x => usedNos.has(x.no))\n const mainPhoto = usedPhotos[this.mainPhotoIndex]\n\n let no = 0\n\n return html`\n <div class=\"result-body\">\n <div class=\"photo-pane\">\n <div class=\"caption\">판정에 사용된 프레임 (동영상에서 추출)</div>\n <div class=\"photo-main\">${mainPhoto ? html`<img src=${mainPhoto.photo.url} alt=\"현장 프레임\" />` : ''}</div>\n <div class=\"photo-thumbs\">\n ${usedPhotos.map(\n (x, i) => html`\n <img\n src=${x.photo.url}\n alt=\"프레임 ${x.no}\"\n ?selected=${i === this.mainPhotoIndex}\n @click=${() => (this.mainPhotoIndex = i)}\n />\n `\n )}\n </div>\n </div>\n\n <div class=\"items-pane\">\n <div class=\"summary-banner\">\n 적용 항목 ${items.length}개 · 자동 판정 ${autoItems.length}개 · 추가 작업 ${moreCount}개\n </div>\n\n ${\n autoItems.length\n ? html`\n <div class=\"group-title\">자동 판정 완료 (${autoItems.length})</div>\n ${autoItems.map(it => this._renderItemCard(it, ++no))}\n `\n : ''\n }\n ${\n moreCount\n ? html`\n <div class=\"group-title\">추가 작업 필요 (${moreCount} 남음)</div>\n ${\n recaptureItems.length\n ? html`\n <div class=\"group-subtitle\">재촬영 필요 (${recaptureItems.length})</div>\n ${recaptureItems.map(it => this._renderItemCard(it, ++no))}\n `\n : ''\n }\n ${\n measureItems.length\n ? html`\n <div class=\"group-subtitle\">기준값 입력 필요 — 3D 계측 (${measureItems.length})</div>\n ${measureItems.map(it => this._renderItemCard(it, ++no))}\n `\n : ''\n }\n ${\n manualItems.length\n ? html`\n <div class=\"group-subtitle\">AI 미지원 — 감리자 수동 확인 (${manualItems.length})</div>\n ${manualItems.map(it => this._renderItemCard(it, ++no))}\n `\n : ''\n }\n `\n : ''\n }\n\n <button class=\"primary-button\" @click=${this._openReport}>종합 검사 리포트</button>\n </div>\n\n ${this.panel !== 'none' ? this._renderSidePane() : ''}\n </div>\n `\n }\n\n private _renderItemCard(item: any, no: number) {\n const group = this._groupOf(item)\n // 측정 완료 항목은 summary(측정 한 줄 설명)를 자르지 않고 그대로, VLM 항목은 관찰/사유\n const desc =\n item.measurements && item.reason\n ? item.reason\n : item.observation\n ? `관찰: ${item.observation}`\n : item.reason || item.measure?.question || ''\n\n return html`\n <div class=\"item-card\" ?selected=${this.selectedItem?.item_id === item.item_id} @click=${() => this._openDetail(item)}>\n <div class=\"item-no\">${no}</div>\n <div class=\"item-main\">\n <div class=\"item-name\">${item.text}</div>\n <div>\n ${\n group === 'auto'\n ? html`<span class=\"chip\">${ROUTING_LABEL[item.routing] || item.routing}</span>\n <span class=\"chip-verdict\">${this._verdictLabel(item)}</span>`\n : group === 'recapture'\n ? html`<span class=\"chip\">추가 촬영 필요</span>`\n : group === 'measure'\n ? html`<span class=\"chip\">AI 측정 모델</span> <span class=\"chip-verdict\">기준값 입력 필요</span>`\n : html`<span class=\"chip\">미지원</span>`\n }\n </div>\n <div class=\"item-desc\">${desc}</div>\n </div>\n ${\n group === 'auto'\n ? html`\n <div class=\"badge\" ?pass=${item.verdict === 'pass'} ?fail=${item.verdict === 'fail'}>\n ${VERDICT_LABEL[item.verdict]}\n </div>\n `\n : group === 'recapture'\n ? html`\n <button\n class=\"capture-button\"\n @click=${(e: Event) => {\n e.stopPropagation()\n this._openRecapture(item)\n }}\n >\n 촬영하기\n </button>\n `\n : group === 'measure'\n ? html`\n <button\n class=\"measure-button\"\n @click=${(e: Event) => {\n e.stopPropagation()\n this._openMeasure(item)\n }}\n >\n ${item.measure?.next_action === 'select_and_input' ? '측정 진행' : '기준값 입력'}\n </button>\n `\n : html`<div class=\"badge\" etc>${this._verdictLabel(item)}</div>`\n }\n </div>\n `\n }\n\n /* ─── 우측 패널: 상세 / 재촬영 / 측정 / 리포트 ─── */\n private _renderSidePane() {\n if (this.panel === 'detail' && this.selectedItem) return this._renderDetailPane(this.selectedItem)\n if (this.panel === 'recapture' && this.selectedItem) return this._renderRecapturePane(this.selectedItem)\n if (this.panel === 'measure' && this.selectedItem) return this._renderMeasurePane(this.selectedItem)\n if (this.panel === 'report') return this._renderReportPane()\n return ''\n }\n\n private _renderDetailPane(item: any) {\n const auto = item.verdict === 'pass' || item.verdict === 'fail'\n const routingLabel = ROUTING_LABEL[item.routing] || item.routing\n const verdictLabel = this._verdictLabel(item)\n const measured = !!item.measurements // 측정 모델로 판정된 항목 — 신뢰도는 확률이 없어 비운다\n\n return html`\n <div class=\"side-pane\">\n <div class=\"detail-header\">\n <span class=\"badge\" ?pass=${item.verdict === 'pass'} ?fail=${item.verdict === 'fail'} ?etc=${!auto}>\n ${routingLabel}\n </span>\n <h3>${verdictLabel}</h3>\n </div>\n <div class=\"detail-summary\">${(item.observation || item.ai_report || '').trim()}</div>\n <div class=\"kv-grid\">\n <div class=\"kv\">\n <label>판정</label>\n <span class=\"verdict-value\" ?pass=${item.verdict === 'pass'} ?fail=${item.verdict === 'fail'}>\n ${verdictLabel || '-'}\n </span>\n </div>\n ${\n !measured && item.confidence != null\n ? html`\n <div class=\"kv\">\n <label>신뢰도</label>\n <span>${Math.round(item.confidence * 100)}%</span>\n </div>\n `\n : ''\n }\n <div class=\"kv\">\n <label>처리</label>\n <span>${routingLabel || '-'}</span>\n </div>\n </div>\n\n <div class=\"reason-box\">\n <div class=\"reason-verdict\">\n <label style=\"font-size: 11px;color: #7d2f2f; display: block; font-weight: bold;\">판단 근거</label>\n ${item.reason}\n </div>\n </div>\n\n ${item.image_data ? html`<img class=\"evidence-img\" src=${item.image_data} alt=\"측정 근거 이미지\" />` : ''}\n\n <button class=\"text-button\" @click=${this._closePanel}>닫기</button>\n </div>\n `\n }\n\n private _renderRecapturePane(item: any) {\n const shot = item.recapture_shots?.[0]\n\n return html`\n <div class=\"side-pane\">\n <h3>${item.text}</h3>\n <div class=\"why-box\">\n <b>왜 재촬영이 필요한가요?</b><br />\n ${item.reason || '판정을 위해 추가 촬영이 필요합니다.'}\n </div>\n ${\n shot\n ? html`\n <div>\n <h4 style=\"margin: 0 0 8px 0; font-size: 13px;\">촬영 가이드</h4>\n <div style=\"font-size: 12px; color: #555;\">${shot.target} — ${shot.how}</div>\n </div>\n `\n : ''\n }\n <div class=\"app-links\">\n <span>앱으로 재촬영</span>\n <a href=${`${appCaptureLink(this._shotTechnique(shot))}&set=${encodeURIComponent(this._shotTag(0))}`}> 촬영 시작 </a>\n </div>\n <div class=\"set-card\" ?uploaded=${!!this.recaptureSet} @click=${() => this._openSetChooser(-1)}>\n <md-icon>${this.recaptureSet ? 'check_circle' : 'video_file'}</md-icon>\n <div class=\"set-main\">\n <b>재촬영 세트</b>\n ${\n this.recaptureSet\n ? html`세트 업로드 완료 ${this.recaptureSet.warnings.map(w => html`<div class=\"set-warn\">⚠ ${w}</div>`)}`\n : html`앱으로 재촬영한 세트를 선택 (또는 파일 직접 선택)`\n }\n </div>\n </div>\n ${this.setPickerFor === -1 ? this._renderSetChooser(-1) : ''}\n ${\n this.recaptureSet ? html`<button class=\"primary-button\" @click=${() => this._runInspection()}>재검사 실행</button>` : ''\n }\n <button class=\"text-button\" @click=${this._closePanel}>닫기</button>\n </div>\n `\n }\n\n /* ─── 측정 패널 (④ 철근 배근 길이 / ⑤ 기둥·벽체 두께) ─── */\n\n /* operator_inputs 정의 기반 숫자/텍스트 입력 렌더 (slot·click·n_frames는 별도 UI/고정) */\n private _renderMeasureFields(item: any) {\n const defs = item.measure?.operator_inputs || []\n const fields: { key: string; label: string; desc?: string; def?: any }[] = []\n for (const d of defs) {\n if (d.key === 'n_frames' || d.key === 'slot' || d.key === 'click') continue\n if (d.fields) {\n // 복합 입력(targets 등): 하위 필드를 각각 입력으로 펼친다\n for (const [k, desc] of Object.entries(d.fields)) {\n if (k === 'name') continue // 부재명은 검사 항목명으로 자동 지정\n fields.push({ key: k, label: FIELD_LABEL[k] || k, desc: String(desc) })\n }\n } else {\n fields.push({ key: d.key, label: FIELD_LABEL[d.key] || d.key, desc: d.desc, def: d.default })\n }\n }\n return fields.map(\n f => html`\n <div class=\"measure-field\">\n <label title=${f.desc || ''}>${f.label}${f.desc ? html` <span style=\"color:#aaa\">— ${f.desc}</span>` : ''}</label>\n <input\n type=\"number\"\n inputmode=\"decimal\"\n .value=${this.measureInputs[f.key] ?? (f.def != null ? String(f.def) : '')}\n placeholder=\"도면값\"\n @input=${(e: Event) => {\n this.measureInputs = { ...this.measureInputs, [f.key]: (e.target as HTMLInputElement).value }\n }}\n />\n </div>\n `\n )\n }\n\n private _renderMeasurePane(item: any) {\n const measure = item.measure || {}\n const isThickness = measure.next_action === 'select_and_input'\n const setOptions = this.uploadedSets\n const done = !!this.measureResult\n\n return html`\n <div class=\"side-pane\">\n <h3>${item.text}</h3>\n <div class=\"detail-header\">\n <span class=\"chip\">3D 계측</span>\n <span style=\"font-size: 12px; color: #777;\">${measure.name || ''} (${measure.status || ''})</span>\n </div>\n ${measure.capture_guide ? html`<div class=\"why-box\">📷 ${measure.capture_guide}</div>` : ''}\n <img\n class=\"capture-guide-img\"\n style=\"background: #fff; border: 1px solid #eee; padding: 6px;\"\n src=${isThickness ? pictoMemberImg : pictoRebarImg}\n alt=\"촬영 안내\"\n />\n\n ${\n setOptions.length > 1\n ? html`\n <div class=\"measure-field\">\n <label>측정할 촬영 세트</label>\n <select\n .value=${String(this.measureSetIndex)}\n @change=${(e: Event) => this._onMeasureSetChange(parseInt((e.target as HTMLSelectElement).value))}\n >\n ${setOptions.map(\n (s, i) =>\n html`<option value=${i} ?selected=${i === this.measureSetIndex}>\n 세트 ${i + 1}${s.technique ? ` (${s.technique})` : ''}\n </option>`\n )}\n </select>\n </div>\n `\n : ''\n }\n ${isThickness ? this._renderThicknessPicker() : ''} ${this._renderMeasureFields(item)}\n ${\n this.measureRunning\n ? html`\n <div class=\"measure-msg\">\n <md-circular-progress indeterminate></md-circular-progress>\n <span>${this.measureMsg || '측정 중...'}</span>\n </div>\n `\n : html`\n <button\n class=\"primary-button\"\n ?disabled=${isThickness && (this.thicknessSlot === null || !this.thicknessClick)}\n @click=${() => (isThickness ? this._runThicknessMeasure(item) : this._runRebarMeasure(item))}\n >\n ${done ? '다시 측정' : isThickness ? '측정 실행 (30~40초)' : '측정 시작 (약 45초)'}\n </button>\n `\n }\n ${\n done\n ? html`\n ${\n this.measureResult.summary || this.measureResult.summary_line || this.measureResult.headline\n ? html`<div class=\"measure-summary\">\n ${this.measureResult.summary || this.measureResult.summary_line || this.measureResult.headline}\n </div>`\n : ''\n }\n ${this.measureImageUrl ? html`<img class=\"evidence-img\" src=${this.measureImageUrl} alt=\"측정 근거\" />` : ''}\n ${\n this.canMutate\n ? html`<button class=\"primary-button\" @click=${() => this._applyMeasurement(item)}>판정 확정</button>`\n : ''\n }\n `\n : ''\n }\n\n <button class=\"text-button\" @click=${this._closePanel}>닫기</button>\n </div>\n `\n }\n\n /* ⑤ 두께: 프레임 선택 + 측정면 클릭 (자동 면 선택은 정확도가 낮아 클릭 단계 생략 불가) */\n private _renderThicknessPicker() {\n return html`\n <div class=\"measure-field\">\n <label>① 모서리가 잘 보이는 프레임을 고르세요</label>\n <div class=\"frame-strip\">\n ${this.thicknessFrames.map(\n f => html`\n <img\n src=${f.thumbUrl || ''}\n alt=\"프레임 ${f.index}\"\n ?selected=${this.thicknessSlot === f.slot}\n @click=${() => this._selectThicknessFrame(f.slot)}\n />\n `\n )}\n </div>\n </div>\n ${\n this.thicknessFrameUrl\n ? html`\n <div class=\"measure-field\">\n <label>② 잴 면의 가운데를 한 번 탭하세요 (모서리·철근 위 말고 <b>면 위</b>)</label>\n <div class=\"click-stage\">\n <img src=${this.thicknessFrameUrl} alt=\"선택 프레임\" @click=${this._onThicknessClick} />\n ${\n this.thicknessClick\n ? html`<div\n class=\"click-dot\"\n style=\"left: ${this.thicknessClick.x * 100}%; top: ${this.thicknessClick.y * 100}%\"\n ></div>`\n : ''\n }\n </div>\n </div>\n `\n : ''\n }\n `\n }\n\n private _renderReportPane() {\n const items = this._sortedItems()\n const summary = this.result?.summary || {}\n const etcCount = (summary.hold || 0) + (summary.pending || 0) + (summary.error || 0)\n\n return html`\n <div class=\"side-pane\">\n <h3>종합 검사 리포트</h3>\n <div class=\"report-counts\">\n <div pass><b>${summary.pass || 0}</b><small>적합</small></div>\n <div fail><b>${summary.fail || 0}</b><small>부적합</small></div>\n <div etc><b>${etcCount}</b><small>미검사</small></div>\n </div>\n <div style=\"overflow-y: auto; max-height: 380px;\">\n ${items.map((it, i) => {\n const expanded = this.expandedReportId === it.item_id\n return html`\n <div class=\"report-item\">\n <div class=\"report-head\" @click=${() => this._toggleReportItem(it.item_id)}>\n <span class=\"report-text\">${i + 1}. ${it.text}</span>\n <span\n class=\"verdict\"\n ?pass=${it.verdict === 'pass'}\n ?fail=${it.verdict === 'fail'}\n ?etc=${it.verdict !== 'pass' && it.verdict !== 'fail'}\n >\n ${this._verdictLabel(it)}\n </span>\n <md-icon class=\"report-caret\" ?open=${expanded}>expand_more</md-icon>\n </div>\n ${\n expanded\n ? html`\n <div class=\"report-basis\">\n ${it.ai_report ? html`<div class=\"report-ai\">${(it.ai_report || '').trim()}</div>` : ''}\n ${it.observation ? html`<div>관찰: ${it.observation}</div>` : ''}\n ${it.reason ? html`<div>판단: ${it.reason}</div>` : ''}\n ${\n it.used_images?.length\n ? html`<div class=\"report-used\">근거 프레임: ${it.used_images.map(n => `#${n}`).join(', ')}</div>`\n : ''\n }\n </div>\n `\n : ''\n }\n </div>\n `\n })}\n </div>\n ${this.canMutate ? html`<button class=\"primary-button\" @click=${this._registerInspection}>검사 등록</button>` : ''}\n <button class=\"text-button\" @click=${this._closePanel}>닫기</button>\n </div>\n `\n }\n\n /* ─── 라이프사이클 ─── */\n async pageUpdated(changes: any, lifecycle: PageLifecycle) {\n if (this.active) {\n this._resetAll()\n this.buildingInspectionId = lifecycle.resourceId || ''\n await this.initBuildingInspection(this.buildingInspectionId)\n await this._loadShotGuide()\n }\n }\n\n async initBuildingInspection(buildingInspectionId: string = '') {\n const response = await client.query({\n query: gql`\n query BuildingInspection($buildingInspectionId: String!) {\n buildingInspection(id: $buildingInspectionId) {\n id\n status\n checklist {\n id\n name\n location\n checklistItems {\n id\n sequence\n mainType\n detailType\n name\n kcsCriteria\n siteSpecCriteria\n }\n }\n buildingLevel {\n id\n floor\n building {\n id\n name\n buildingComplex {\n id\n }\n }\n }\n }\n }\n `,\n variables: { buildingInspectionId }\n })\n\n if (response.errors) return\n\n this.buildingInspection = response.data.buildingInspection\n\n // 삭제(soft delete)됐거나 다른 projectType의 검측이면 서버가 null을 준다.\n // 그대로 진행하면 뒤 쿼리에 undefined가 실려 GraphQL 에러가 난다.\n if (!this.buildingInspection) {\n notify({ message: '삭제되었거나 접근할 수 없는 검측입니다.', level: 'warn' })\n return\n }\n\n await this._getProjectByBuildingComplexId(this.buildingInspection?.buildingLevel?.building?.buildingComplex?.id)\n }\n\n private async _getProjectByBuildingComplexId(buildingComplexId) {\n const response = await client.query({\n query: gql`\n query ProjectByBuildingComplexId($buildingComplexId: String!) {\n project: projectByBuildingComplexId(buildingComplexId: $buildingComplexId) {\n id\n name\n }\n }\n `,\n variables: { buildingComplexId }\n })\n\n if (response.errors) return\n\n this.project = response.data.project\n }\n\n /* ─── 서버 호출 공통 ─── */\n\n /* 엔진 실행 공통 호출: input(JSON) + 파일들을 multipart로 전송 */\n private async _callEngine(input: any, files: File[] = []) {\n const form = new FormData()\n form.append('input', JSON.stringify(input))\n for (const file of files) form.append('files', file, file.name)\n\n const response = await fetch(ENGINE_RUN_URL, {\n method: 'POST',\n headers: { Authorization: ENGINE_AUTH },\n body: form\n })\n // 러너/프록시가 에러를 낼 때는 JSON 이 아닐 수 있다(502 HTML 등) — 본문을 그대로 보여준다\n const text = await response.text()\n let raw: any\n try {\n raw = JSON.parse(text)\n } catch {\n throw new Error(`AI 엔진 응답 오류 (HTTP ${response.status}) ${text.slice(0, 200)}`)\n }\n const data = raw?.result || {}\n if (data?.status !== 'success') {\n // raw.detail: 러너가 요청을 거부한 사유(예: 파일/필드 크기 초과)\n // raw.stderr: 모듈이 죽은 경우의 파이썬 트레이스백 — 원인이 여기 있다\n const stderr = (raw?.stderr || '').trim().split('\\n').slice(-3).join(' ')\n throw new Error(\n data?.error ||\n raw?.error ||\n raw?.detail ||\n stderr ||\n `AI 엔진 호출에 실패했습니다. (HTTP ${response.status})`\n )\n }\n return data.result\n }\n\n /* 측정 서버 호출 (JSON 응답) */\n private async _callMeasure(path: string, init: RequestInit = {}) {\n const response = await fetch(`${MEASURE_BASE_URL}${path}`, {\n ...init,\n headers: { ...((init.headers as any) || {}), Authorization: MEASURE_AUTH }\n })\n const data = await response.json().catch(() => ({}))\n if (!response.ok) {\n const msg = data?.errors?.join('\\n') || data?.detail || data?.error || `측정 서버 오류 (${response.status})`\n throw new Error(msg)\n }\n return data\n }\n\n /* 측정 서버 이미지 → blob URL (img src는 인증 헤더를 못 실어서 fetch로 받는다) */\n private async _fetchMeasureImage(path: string): Promise<string> {\n const response = await fetch(`${MEASURE_BASE_URL}${path}`, { headers: { Authorization: MEASURE_AUTH } })\n if (!response.ok) throw new Error(`이미지 수신 실패 (${response.status})`)\n const url = URL.createObjectURL(await response.blob())\n this.objectUrls.push(url)\n return url\n }\n\n /* [1단계] 촬영 가이드 생성 (plan-shots) */\n private async _loadShotGuide() {\n const checklist = this.engineChecklist\n if (!checklist.length) {\n notify({ message: '체크리스트 항목이 없습니다.', level: 'warn' })\n return\n }\n\n try {\n this.loading = true\n this.loadingText = 'AI 촬영 가이드 생성 중...'\n this.guide = await this._callEngine({ action: 'plan-shots', checklist })\n this.sets = new Array((this.guide?.shots || []).length).fill(null)\n // 어느 촬영에도 배정되지 않은 항목이 있으면 그 항목은 판정 근거가 없다 → 재생성 권고\n const unassigned = this.guide?.unassigned_items || []\n if (unassigned.length) {\n notify({\n message: `촬영에 배정되지 않은 검사항목이 ${unassigned.length}건 있습니다. 촬영 가이드를 다시 생성해보세요.`,\n level: 'warn'\n })\n }\n // 자동 등록 기준 시각 — 이 시점 이후 올라온 세트만 자동으로 붙인다.\n // (예전 테스트 세트가 태그만 같다고 채워지면 \"찍지도 않았는데 완료\"로 보인다)\n this.autoAttachSince = Date.now() / 1000\n } catch (error) {\n console.error('촬영 가이드 생성 실패:', error)\n notify({ message: (error as Error).message, level: 'error' })\n } finally {\n this.loading = false\n }\n }\n\n /* plan-shots가 준 촬영별 항목 배정 → {촬영번호: [항목ID]} (엔진 inspect 의 shot_items).\n 배정 정보가 없는 구버전 응답이면 null 을 돌려 종전대로(전 항목이 전 사진) 동작시킨다. */\n private _shotItemsMap(): Record<string, string[]> | null {\n const shots = this.guide?.shots || []\n const map: Record<string, string[]> = {}\n for (let i = 0; i < shots.length; i++) {\n const items = shots[i]?.items\n if (!Array.isArray(items) || !items.length) continue\n map[String(shots[i]?.shot_no || i + 1)] = items\n }\n return Object.keys(map).length ? map : null\n }\n\n /* 세트가 아직 안 올라온 촬영에 배정된 항목 ID 집합 (그 항목은 판정할 사진이 없다) */\n private _itemsAwaitingShot(): Set<string> {\n const pending = new Set<string>()\n const shots = this.guide?.shots || []\n for (let i = 0; i < shots.length; i++) {\n if (this.sets[i]) continue\n for (const id of shots[i]?.items || []) pending.add(id)\n }\n return pending\n }\n\n /* 촬영 칸마다 고유 태그 — 앱에 부재 ID로 넘겨 두면, 올라온 세트의 member_id로\n \"어느 촬영 칸의 것인지\" 되찾을 수 있다 (앱↔플랫폼 왕복에 식별자가 없어서 쓰는 방법) */\n private _shotTag(shotNo: number) {\n return `${(this.buildingInspectionId || 'ins').replace(/-/g, '').slice(0, 6)}-${shotNo}`\n }\n\n /* 촬영 지시문에서 기술 추론 — 앱의 촬영 안내만 달라진다(측정은 meta.technique를 안 봄) */\n private _shotTechnique(shot: any): 'cover' | 'thick' {\n const text = `${shot?.target || ''} ${shot?.how || ''}`\n if (/두께|콘크리트\\s*면|거푸집|탈형|벽체\\s*면/.test(text)) return 'thick'\n return 'cover'\n }\n\n private _shotAppLink(shot: any, index: number) {\n const tag = this._shotTag(shot?.shot_no || index + 1)\n return `${appCaptureLink(this._shotTechnique(shot))}&set=${encodeURIComponent(tag)}`\n }\n\n /* 앱에서 촬영하고 돌아오면 태그로 찾아 해당 촬영 칸에 자동 등록 */\n private async _autoAttachTaggedSets() {\n if (!this.guide?.shots?.length) return\n await this._loadRecentSets()\n const used = new Set(this.uploadedSets.map(s => s.setId))\n const attached: number[] = []\n const next = [...this.sets]\n\n this.guide.shots.forEach((shot: any, i: number) => {\n if (next[i]) return\n const tag = this._shotTag(shot?.shot_no || i + 1)\n // 이 화면을 연 뒤에 올라온 것만 — 예전 세트는 목록에서 직접 고르게 둔다\n const hit = this.recentSets.find(\n s => s.member_id === tag && !used.has(s.set_id) && (s.uploaded_at || 0) >= this.autoAttachSince\n )\n if (!hit) return\n used.add(hit.set_id)\n next[i] = { setId: hit.set_id, technique: hit.technique, label: `세트 ${hit.set_id}`, warnings: [] }\n attached.push(shot?.shot_no || i + 1)\n })\n\n if (attached.length) {\n this.sets = next\n notify({ message: `촬영 ${attached.join('·')} 세트를 자동으로 등록했습니다.` })\n }\n }\n\n /* 세트 선택 목록 — 앱이 올린 최근 세트 + 파일 직접 선택 폴백 */\n private _renderSetChooser(index: number) {\n return html`\n <div class=\"set-chooser\">\n ${\n this.recentLoading\n ? html`<div class=\"chooser-empty\">불러오는 중...</div>`\n : this.recentSets.length\n ? this.recentSets.map(\n s => html`\n <button class=\"chooser-row\" @click=${() => this._pickExistingSet(index, s)}>\n <b>${_setTimeLabel(s.set_id)}</b>\n <span>\n ${s.member_id ? `${s.member_id} · ` : ''}${s.technique || '기술 미상'}\n ${s.duration_sec ? ` · ${Math.round(s.duration_sec)}초` : ''}\n </span>\n </button>\n `\n )\n : html`<div class=\"chooser-empty\">\n 올라온 세트가 없습니다. 카드의 「앱으로 촬영」으로 찍으면 여기에 나타납니다.\n </div>`\n }\n <div class=\"chooser-actions\">\n <button class=\"text-button\" @click=${() => this._loadRecentSets()}>새로고침</button>\n <button class=\"text-button\" @click=${() => this._openSetPicker(index)}>파일 직접 선택</button>\n </div>\n </div>\n `\n }\n\n /* ─── 세트 선택/업로드 ─── */\n\n /* 촬영 앱이 측정 서버로 바로 올린 세트 목록 (앱에서 촬영 후 저장하면 자동 전송된다) */\n private async _loadRecentSets() {\n try {\n this.recentLoading = true\n const data = await this._callMeasure('/api/sets?limit=20')\n this.recentSets = data.sets || []\n } catch (error) {\n console.error('세트 목록 조회 실패:', error)\n this.recentSets = []\n } finally {\n this.recentLoading = false\n }\n }\n\n /* 카드 탭 → 목록 펼치기 (이미 고른 세트는 제외하고 보여준다) */\n private _openSetChooser(index: number) {\n this.setPickerFor = this.setPickerFor === index ? null : index\n if (this.setPickerFor !== null) this._loadRecentSets()\n }\n\n /* 목록에서 세트 선택 — 이미 서버에 있으므로 업로드 없이 연결만 한다 */\n private _pickExistingSet(index: number, s: any) {\n const set: SetInfo = {\n setId: s.set_id,\n technique: s.technique,\n label: `세트 ${s.set_id}`,\n warnings: []\n }\n if (index === -1) {\n this.recaptureSet = set\n } else {\n const next = [...this.sets]\n next[index] = set\n this.sets = next\n }\n this.setPickerFor = null\n }\n\n private _openSetPicker(index: number) {\n this.pendingSetIndex = index\n this.setPickerFor = null\n this.setInputEl?.click()\n }\n\n private async _onSetFilesSelected(event: Event) {\n const input = event.target as HTMLInputElement\n const files = Array.from(input?.files || [])\n input.value = ''\n const index = this.pendingSetIndex\n this.pendingSetIndex = null\n if (!files.length || index === null) return\n\n // zip 1개 또는 필수 3파일 검증 (한 번의 선택으로 3개 멀티선택)\n const isZip = files.length === 1 && /\\.zip$/i.test(files[0].name)\n if (!isZip) {\n const names = files.map(f => f.name.toLowerCase())\n const missing = SET_FILES.filter(n => !names.includes(n))\n if (missing.length) {\n notify({\n message: `세트 파일이 부족합니다. 누락: ${missing.join(', ')} — 촬영 앱이 만든 3개 파일을 한 번에 선택해주세요.`,\n level: 'warn'\n })\n return\n }\n }\n\n try {\n this.loading = true\n this.loadingText = '촬영 세트 업로드 중...'\n const form = new FormData()\n for (const f of files) if (isZip || SET_FILES.includes(f.name.toLowerCase())) form.append('files', f, f.name)\n const data = await this._callMeasure('/api/sets', { method: 'POST', body: form })\n\n const set: SetInfo = {\n setId: data.set_id,\n technique: data.technique,\n label: `세트 ${data.set_id}`,\n warnings: data.warnings || []\n }\n if (index === -1) {\n this.recaptureSet = set\n } else {\n const next = [...this.sets]\n next[index] = set\n this.sets = next\n }\n for (const w of set.warnings) notify({ message: `업로드 경고: ${w}`, level: 'warn' })\n } catch (error) {\n console.error('세트 업로드 실패:', error)\n notify({ message: (error as Error).message, level: 'error' })\n } finally {\n this.loading = false\n }\n }\n\n /* 세트의 대표 3프레임(vlm)을 받아 File 목록으로 (시간순 유지) */\n private async _fetchVlmFrames(set: SetInfo, setIndex: number): Promise<{ file: File; url: string; setIndex: number }[]> {\n const data = await this._callMeasure(`/api/sets/${set.setId}/vlm-frames`)\n const out: { file: File; url: string; setIndex: number }[] = []\n for (const f of data.frames || []) {\n const response = await fetch(`${MEASURE_BASE_URL}${f.url}`, { headers: { Authorization: MEASURE_AUTH } })\n if (!response.ok) throw new Error(`프레임 수신 실패 (${response.status})`)\n const blob = await response.blob()\n const file = new File([blob], `set${setIndex + 1}_${f.name}`, { type: 'image/jpeg' })\n const url = URL.createObjectURL(file)\n this.objectUrls.push(url)\n out.push({ file, url, setIndex })\n }\n return out\n }\n\n /* [2단계] 자동 판정 실행 (inspect)\n * - 최초 판정: 업로드된 모든 세트의 대표 3프레임 + 전체 체크리스트 (input_kind=video_frames)\n * - 재검사(재촬영 패널): 새 세트의 3프레임만 + 해당 항목만 재판정 후 결과 병합 */\n private async _runInspection() {\n const isRecapture = this.panel === 'recapture' && !!this.selectedItem\n\n try {\n this.loading = true\n this.loadingText = '동영상 프레임 추출 중...'\n\n let newPhotos: { file: File; url: string; setIndex: number }[] = []\n const imageShots: number[] = [] // 사진마다 어느 촬영(shot_no)의 것인지\n if (isRecapture) {\n if (!this.recaptureSet) {\n notify({ message: '재촬영 세트를 먼저 업로드해주세요.', level: 'warn' })\n return\n }\n this.recaptureBase = this.photos.length\n newPhotos = await this._fetchVlmFrames(this.recaptureSet, this.sets.length)\n } else {\n if (!this.uploadedSets.length) {\n notify({ message: '업로드된 촬영 세트가 없습니다.', level: 'warn' })\n return\n }\n // 촬영 칸 순서대로 — 비어 있는 칸은 건너뛰되 촬영번호는 가이드 것을 그대로 쓴다\n for (let i = 0; i < this.sets.length; i++) {\n const set = this.sets[i]\n if (!set) continue\n const frames = await this._fetchVlmFrames(set, i)\n const shotNo = this.guide?.shots?.[i]?.shot_no || i + 1\n for (const _ of frames) imageShots.push(shotNo)\n newPhotos = [...newPhotos, ...frames]\n }\n }\n\n const files = newPhotos.map(p => p.file)\n let checklist = isRecapture\n ? this.engineChecklist.filter(c => c.item_id === this.selectedItem.item_id)\n : this.engineChecklist\n\n // 아직 안 올라온 촬영에 배정된 항목은 이번 판정에서 뺀다.\n // 엔진은 그런 항목의 사진 범위를 비우는 대신 '전체 사진'을 주므로, 그냥 두면\n // 타설 후 항목이 배근 사진으로 판정된다 (배근·타설은 며칠 간격으로 찍는다).\n if (!isRecapture) {\n const pending = this._itemsAwaitingShot()\n if (pending.size) {\n checklist = checklist.filter(c => !pending.has(c.item_id))\n notify({\n message: `아직 촬영되지 않은 항목 ${pending.size}건은 이번 판정에서 제외했습니다. 해당 촬영을 올린 뒤 다시 실행하세요.`,\n level: 'warn'\n })\n }\n }\n\n // 촬영 배정 되돌리기 — 이걸 안 보내면 모든 항목이 모든 사진을 보게 되어\n // \"타설 후 항목이 배근 사진으로 판정되는\" 오판이 난다 (엔진 실증에서 실제 발생).\n // 배정된 촬영이 안 올라온 항목은 엔진이 hold 로 둔다 — 남의 사진으로 판정하지 않게.\n const shotItems = this._shotItemsMap()\n const scoping = !isRecapture && shotItems && imageShots.length === files.length\n\n // 항목을 나눠 여러 번 호출한다. 엔진이 한 번에 8개까지만 병렬 처리하는데,\n // 그 앞단 Cloudflare 가 100초에서 연결을 끊어 항목이 많으면 524 가 난다.\n const batches: any[][] = []\n for (let i = 0; i < checklist.length; i += INSPECT_BATCH) {\n batches.push(checklist.slice(i, i + INSPECT_BATCH))\n }\n\n let result: any = null\n for (let b = 0; b < batches.length; b++) {\n this.loadingText =\n batches.length > 1\n ? `AI 자동 판정 중... (${b + 1}/${batches.length} 묶음, 항목 ${batches[b].length}개)`\n : 'AI 자동 판정 중... (최대 1~2분 소요)'\n\n const input: any = { action: 'inspect', checklist: batches[b], input_kind: 'video_frames' }\n if (scoping) {\n input.image_shots = imageShots.join(',')\n input.shot_items = JSON.stringify(shotItems)\n }\n const part = await this._callEngine(input, files)\n result = result ? _mergeInspectResults(result, part) : part\n }\n\n if (isRecapture) {\n this.photos = [...this.photos, ...newPhotos]\n this._mergeItems(result?.items_sorted || result?.items || [], this.recaptureBase)\n this.recaptureSet = null\n } else {\n this.photos = newPhotos\n this.result = result\n }\n this.panel = 'none'\n this.selectedItem = null\n this.mainPhotoIndex = 0\n } catch (error) {\n console.error('AI 자동 판정 실패:', error)\n notify({ message: (error as Error).message, level: 'error' })\n } finally {\n this.loading = false\n }\n }\n\n /* 부분 재판정/측정 확정 결과를 기존 전체 결과에 병합하고 summary 재계산\n * - usedImageBase: used_images(부분집합 1-based) → 전체 프레임 인덱스 보정값 */\n private _mergeItems(updatedItems: any[], usedImageBase: number = 0) {\n const updated = updatedItems.map((it: any) => ({\n ...it,\n used_images: (it.used_images || []).map((n: number) => n + usedImageBase)\n }))\n const byId = new Map(updated.map((it: any) => [it.item_id, it]))\n const replace = (arr: any[]) => (arr || []).map(it => byId.get(it.item_id) || it)\n\n const items = replace(this.result?.items)\n const itemsSorted = this.result?.items_sorted ? replace(this.result.items_sorted) : undefined\n\n const summary: Record<string, number> = { pass: 0, fail: 0, hold: 0, pending: 0, error: 0, measure: 0 }\n for (const it of itemsSorted || items) {\n summary[it.verdict] = (summary[it.verdict] || 0) + 1\n if (it.verdict === 'pending' && it.pending_reason === 'measure') summary.measure += 1\n }\n summary.total = (itemsSorted || items).length\n\n this.result = { ...this.result, items, ...(itemsSorted ? { items_sorted: itemsSorted } : {}), summary }\n }\n\n private _resetAll() {\n this.objectUrls.forEach(u => URL.revokeObjectURL(u))\n this.objectUrls = []\n this.guide = null\n this.sets = []\n this.photos = []\n this.result = null\n this.panel = 'none'\n this.selectedItem = null\n this.mainPhotoIndex = 0\n this.recaptureBase = 0\n this.recaptureSet = null\n this._resetMeasureState()\n }\n\n private _resetMeasureState() {\n this.measureInputs = {}\n this.measureRunning = false\n this.measureMsg = ''\n this.measureResult = null\n this.measureImageUrl = ''\n this.thicknessFrames = []\n this.thicknessSlot = null\n this.thicknessFrameUrl = ''\n this.thicknessClick = null\n }\n\n /* ─── 패널 열기/닫기 ─── */\n private _openDetail(item: any) {\n const group = this._groupOf(item)\n // 재촬영/측정 항목은 상세 대신 해당 작업 패널을 바로 표시\n if (group === 'recapture') {\n this._openRecapture(item)\n return\n }\n if (group === 'measure') {\n this._openMeasure(item)\n return\n }\n this.selectedItem = item\n this.mainPhotoIndex = 0 // 선택 항목의 첫 사용 프레임부터 표시\n this.panel = 'detail'\n }\n\n private _openRecapture(item: any) {\n this.selectedItem = item\n this.recaptureSet = null\n this.panel = 'recapture'\n }\n\n private async _openMeasure(item: any) {\n this.selectedItem = item\n this._resetMeasureState()\n this.panel = 'measure'\n\n // 촬영 기술이 맞는 세트를 기본 선택 (④=04_cover, ⑤=05_thickness)\n const wantTech = item.measure?.model_id?.startsWith('rebar') ? '04_cover' : '05_thickness'\n const sets = this.uploadedSets\n const found = sets.findIndex(s => s.technique === wantTech)\n this.measureSetIndex = found >= 0 ? found : 0\n\n if (item.measure?.next_action === 'select_and_input') {\n await this._loadThicknessFrames()\n }\n }\n\n private async _onMeasureSetChange(index: number) {\n this.measureSetIndex = index\n this.measureResult = null\n this.measureImageUrl = ''\n if (this.selectedItem?.measure?.next_action === 'select_and_input') {\n this.thicknessSlot = null\n this.thicknessFrameUrl = ''\n this.thicknessClick = null\n await this._loadThicknessFrames()\n }\n }\n\n private _openReport = () => {\n this.panel = 'report'\n this.selectedItem = null\n this.expandedReportId = null\n // 리포트 패널이 우측 상단에 뜨므로 스크롤을 맨 위로 (판정 리스트는 자체 스크롤)\n this.updateComplete.then(() => {\n this.renderRoot.querySelector('div[body]')?.scrollTo({ top: 0, behavior: 'smooth' })\n this.renderRoot.querySelector('.items-pane')?.scrollTo({ top: 0, behavior: 'smooth' })\n })\n }\n\n /* 종합 리포트 항목 펼치기/접기 (한 번에 하나만 펼침) */\n private _toggleReportItem(id: string) {\n this.expandedReportId = this.expandedReportId === id ? null : id\n }\n\n private _closePanel = () => {\n this.panel = 'none'\n this.selectedItem = null\n }\n\n private _sortedItems(): any[] {\n return this.result?.items_sorted || this.result?.items || []\n }\n\n /* ─── ④ 철근 배근 길이 측정 (비동기 job + 진행률 폴링) ─── */\n private async _runRebarMeasure(item: any) {\n const set = this.uploadedSets[this.measureSetIndex]\n if (!set) {\n notify({ message: '측정할 촬영 세트가 없습니다.', level: 'warn' })\n return\n }\n const memberDim = parseFloat(this.measureInputs.member_dim_mm)\n const coverSpec = parseFloat(this.measureInputs.cover_spec_mm)\n if (!memberDim || !coverSpec) {\n notify({ message: '설계 단면 치수와 기준 피복두께를 입력해주세요. (도면값)', level: 'warn' })\n return\n }\n\n try {\n this.measureRunning = true\n this.measureMsg = '측정 시작...'\n this.measureResult = null\n this.measureImageUrl = ''\n\n const { job } = await this._callMeasure('/api/rebar/measure', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n set_id: set.setId,\n targets: [{ name: item.text || '측정 대상', member_dim_mm: memberDim, cover_spec_mm: coverSpec }]\n })\n })\n\n // 진행률 폴링 — msg는 서버가 주는 한국어 문구 그대로 표시\n let status: any\n do {\n await new Promise(r => setTimeout(r, 1500))\n status = await this._callMeasure(`/api/job/${job}`)\n this.measureMsg = status.msg || '측정 중...'\n } while (status.state !== 'done' && this.panel === 'measure')\n\n if (this.panel !== 'measure') return // 패널을 닫았으면 결과 무시\n const r = status.result || {}\n if (!r.ok) {\n notify({ message: r.why || '측정에 실패했습니다.', level: 'error' })\n // 실패 결과도 확정 가능(엔진이 hold로 변환) — 결과는 보관하되 이미지 없음\n this.measureResult = r\n return\n }\n this.measureResult = r\n // 측정에 쓴 프레임 중 가운데 프레임에 측정선 오버레이\n const frames = r.frames_used || []\n const overlayIdx = frames.length ? frames[Math.floor(frames.length / 2)] : 0\n try {\n this.measureImageUrl = await this._fetchMeasureImage(`/api/rebar/overlay/${job}/${overlayIdx}?w=1280`)\n } catch (e) {\n console.warn('오버레이 수신 실패:', e)\n }\n } catch (error) {\n console.error('철근 측정 실패:', error)\n notify({ message: (error as Error).message, level: 'error' })\n } finally {\n this.measureRunning = false\n this.measureMsg = ''\n }\n }\n\n /* ─── ⑤ 기둥·벽체 두께 측정 (프레임 선택 + 면 클릭, 동기) ─── */\n private async _loadThicknessFrames() {\n const set = this.uploadedSets[this.measureSetIndex]\n if (!set) return\n try {\n this.measureRunning = true\n this.measureMsg = '스윕에서 프레임 뽑는 중... (첫 호출은 10초쯤)'\n const data = await this._callMeasure(`/api/thickness/frames/${set.setId}`)\n const frames = (data.frames || []) as { slot: number; index: number }[]\n // 썸네일은 인증 때문에 fetch로 받아 blob URL로\n const withThumbs: { slot: number; index: number; thumbUrl?: string }[] = []\n for (const f of frames) {\n try {\n const thumbUrl = await this._fetchMeasureImage(`/api/thickness/frame/${set.setId}/${f.slot}?thumb=1`)\n withThumbs.push({ ...f, thumbUrl })\n } catch {\n withThumbs.push(f)\n }\n }\n this.thicknessFrames = withThumbs\n if (withThumbs.length) await this._selectThicknessFrame(withThumbs[Math.floor(withThumbs.length / 2)].slot)\n } catch (error) {\n console.error('프레임 목록 실패:', error)\n notify({ message: (error as Error).message, level: 'error' })\n } finally {\n this.measureRunning = false\n this.measureMsg = ''\n }\n }\n\n private async _selectThicknessFrame(slot: number) {\n const set = this.uploadedSets[this.measureSetIndex]\n if (!set) return\n this.thicknessSlot = slot\n this.thicknessClick = null\n try {\n this.thicknessFrameUrl = await this._fetchMeasureImage(`/api/thickness/frame/${set.setId}/${slot}`)\n } catch (error) {\n notify({ message: (error as Error).message, level: 'error' })\n }\n }\n\n /* 클릭 좌표를 표시 크기로 나눠 0~1 정규화 — 원본 해상도는 알 필요 없다 */\n private _onThicknessClick = (e: MouseEvent) => {\n if (this.measureRunning) return\n const rect = (e.target as HTMLElement).getBoundingClientRect()\n this.thicknessClick = {\n x: (e.clientX - rect.left) / rect.width,\n y: (e.clientY - rect.top) / rect.height\n }\n }\n\n private async _runThicknessMeasure(item: any) {\n const set = this.uploadedSets[this.measureSetIndex]\n if (!set || this.thicknessSlot === null || !this.thicknessClick) {\n notify({ message: '프레임을 고르고 잴 면을 탭해주세요.', level: 'warn' })\n return\n }\n\n try {\n this.measureRunning = true\n this.measureMsg = '측정 중... (여러 프레임 합의 측정, 30~40초)'\n this.measureResult = null\n this.measureImageUrl = ''\n\n const form = new FormData()\n form.append('set_id', set.setId)\n form.append('slot', String(this.thicknessSlot))\n form.append('x', String(this.thicknessClick.x))\n form.append('y', String(this.thicknessClick.y))\n if (this.measureInputs.design_mm) form.append('design_mm', this.measureInputs.design_mm)\n if (this.measureInputs.tol_mm) form.append('tol_mm', this.measureInputs.tol_mm)\n\n const r = await this._callMeasure('/api/thickness/measure', { method: 'POST', body: form })\n this.measureResult = r\n if (r.image_data) this.measureImageUrl = r.image_data\n if (!r.ok) notify({ message: r.summary || r.headline || '측정에 실패했습니다.', level: 'warn' })\n } catch (error) {\n console.error('두께 측정 실패:', error)\n notify({ message: (error as Error).message, level: 'error' })\n } finally {\n this.measureRunning = false\n this.measureMsg = ''\n }\n }\n\n /* ─── 측정 결과 → 판정 확정 (apply-measurement, OpenAI 미호출·즉시 응답) ─── */\n private async _applyMeasurement(item: any) {\n if (!this.measureResult) return\n try {\n this.loading = true\n this.loadingText = '판정 확정 중...'\n // 측정값·판정 근거는 그대로 전달한다 — 품질 게이트/hold 승격은 엔진이 처리한다.\n // 다만 근거 이미지(base64)는 빼고 보낸다: 엔진은 이 값을 판정에 쓰지 않고 그대로\n // 되돌려줄 뿐인데(engine.apply_measurement), 러너의 multipart 단일 필드 한도가\n // 1MB 라서 실어 보내면 400 \"Part exceeded maximum size of 1024KB\" 가 난다.\n // 화면 표시·첨부에 쓰는 값이므로 판정 결과에 다시 붙여 준다.\n const { image_data, image, map_png, overlay_b64, result_image, ...slimResult } = this.measureResult\n const result = await this._callEngine({\n action: 'apply-measurement',\n item: { item_id: item.item_id, text: item.text, category: item.category },\n model_id: item.measure?.model_id || this.measureResult.model_id,\n result: slimResult\n })\n\n const judged = { ...item, ...result.item, ...(image_data ? { image_data } : {}) }\n // 측정 서버가 retake 를 내면 재촬영이다 — 측정 길이가 부재 치수보다 길게 나온 경우로,\n // 시공 불량이 아니라 측정 오류다. 검측 엔진은 이 값을 모르고 '부적합'으로 판정하므로\n // (engine.py 는 없어진 unreliable 을 본다) 여기서 되돌린다. 서버 판정을 그대로 쓰는 것.\n if (this.measureResult.retake) {\n judged.verdict = 'hold'\n judged.reason = this.measureResult.summary || '측정 길이가 부재 치수보다 길게 나왔습니다. 다시 촬영해 주세요.'\n }\n this._mergeItems([judged])\n // 확정 즉시 체크리스트에 기록한다. 「검사 등록」까지 미루면 그 사이에 화면을 벗어나거나\n // 재판정이 일어났을 때 측정 판정만 유실된다 (VLM 항목은 inspect 결과에 남아 있어 티가 안 남).\n await this._saveJudgments([judged])\n this._resetMeasureState()\n this.panel = 'none'\n this.selectedItem = null\n\n if (judged.verdict === 'hold') {\n // 재촬영 사유는 측정 서버가 낸 문장을 그대로 쓴다 — 플랫폼이 촬영 품질을 근거로\n // 재촬영을 권하지 않는다(2026-09-12-2 전달본 정책).\n notify({ message: judged.reason || '재촬영이 필요합니다.', level: 'warn' })\n } else {\n notify({ message: `판정이 확정되었습니다: ${this._verdictLabel(judged)}` })\n }\n } catch (error) {\n console.error('판정 확정 실패:', error)\n notify({ message: (error as Error).message, level: 'error' })\n } finally {\n this.loading = false\n }\n }\n\n /* base64 data URL → File (측정 근거 이미지 첨부용) */\n private _dataUrlToFile(dataUrl: string, name: string): File | null {\n try {\n const [head, body] = dataUrl.split(',')\n const mime = head.match(/data:(.*?);/)?.[1] || 'image/jpeg'\n const bin = atob(body)\n const bytes = new Uint8Array(bin.length)\n for (let i = 0; i < bin.length; i++) bytes[i] = bin.charCodeAt(i)\n return new File([bytes], name, { type: mime })\n } catch {\n return null\n }\n }\n\n /* 적합/부적합으로 판정된 항목을 체크리스트의 감리자 확인란에 기록한다.\n 보류·미지원·오류는 미검사로 남긴다(자동으로 부적합 처리하지 않는다). */\n private async _saveJudgments(items: any[]) {\n const judged = items.filter(it => it.verdict === 'pass' || it.verdict === 'fail')\n if (!judged.length) return 0\n\n const response = await client.mutate({\n mutation: gql`\n mutation UpdateChecklistItemsAiJudgment($items: [ChecklistItemAiJudgment!]!) {\n updateChecklistItemsAiJudgment(items: $items)\n }\n `,\n variables: {\n items: judged.map(it => ({\n id: it.item_id,\n supervisoryConfirmStatus: it.verdict === 'pass' ? 'T' : 'F'\n }))\n }\n })\n if (response.errors) throw new Error(response.errors[0]?.message || '검사 결과 저장에 실패했습니다.')\n return judged.length\n }\n\n /* ─── 검사 등록: 감리자 판정 자동 반영 + AI판단 근거 첨부 ─── */\n private async _registerInspection() {\n const items = this._sortedItems()\n if (!items.length) {\n notify({ message: '판정 결과가 없습니다.', level: 'warn' })\n return\n }\n // 적합/부적합으로 자동 판정된 항목만 반영 (보류/미지원/오류는 미검사로 건너뜀)\n const judged = items.filter(it => it.verdict === 'pass' || it.verdict === 'fail')\n\n try {\n this.loading = true\n this.loadingText = '검사 결과 등록 중...'\n\n // 1) 감리자 적합/부적합 자동 채움 (적합/부적합 판정된 항목만, 없으면 건너뜀)\n await this._saveJudgments(items)\n\n // 2) 항목별 첨부: 판단 근거(AI판단 텍스트) + 근거 프레임/측정 근거 이미지\n // ai_report는 pending/error에서 빈 문자열로 오므로 그 항목은 첨부하지 않는다\n const attachments: any[] = []\n for (const it of items) {\n if (it.ai_report) {\n attachments.push({\n file: new File([it.ai_report], `AI판단_${(it.text || it.item_id).slice(0, 30)}.txt`, { type: 'text/plain' }),\n refBy: it.item_id,\n refType: 'ChecklistItem',\n description: 'AI판단'\n })\n }\n for (const n of it.used_images || []) {\n const photo = this.photos[n - 1]\n if (photo) {\n attachments.push({ file: photo.file, refBy: it.item_id, refType: 'ChecklistItem', description: 'AI판단' })\n }\n }\n // 측정 항목의 근거 이미지 (apply-measurement 응답의 base64)\n if (it.image_data) {\n const file = this._dataUrlToFile(it.image_data, `AI측정근거_${(it.text || it.item_id).slice(0, 30)}.jpg`)\n if (file) attachments.push({ file, refBy: it.item_id, refType: 'ChecklistItem', description: 'AI판단' })\n }\n }\n\n if (attachments.length) {\n const attachResponse = await client.mutate({\n mutation: gql`\n mutation CreateAttachments($attachments: [NewAttachment!]!) {\n createAttachments(attachments: $attachments) {\n id\n }\n }\n `,\n variables: { attachments },\n context: { hasUpload: true }\n })\n\n if (attachResponse.errors) throw new Error(attachResponse.errors[0]?.message || 'AI판단 자료 첨부에 실패했습니다.')\n }\n\n notify({ message: `검사 결과를 등록하였습니다. (자동 판정 ${judged.length}건 반영)` })\n\n // 등록 후 체크리스트 화면으로 이동\n navigate(`building-inspection-detail-checklist/${this.buildingInspectionId}`)\n } catch (error) {\n console.error('검사 등록 실패:', error)\n notify({ message: (error as Error).message, level: 'error' })\n } finally {\n this.loading = false\n }\n }\n}\n"]}