@dssp/supervision 1.0.6 → 1.0.7
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.
- package/dist-client/assets/ai-measurement/capture_guide.png +0 -0
- package/dist-client/assets/ai-measurement/picto-common-sweep.svg +11 -0
- package/dist-client/assets/ai-measurement/picto-member-corner.svg +11 -0
- package/dist-client/assets/ai-measurement/picto-rebar-parallel.svg +14 -0
- package/dist-client/pages/building-inspection/building-inspection-detail-ai-measurement.d.ts +59 -13
- package/dist-client/pages/building-inspection/building-inspection-detail-ai-measurement.js +995 -223
- package/dist-client/pages/building-inspection/building-inspection-detail-ai-measurement.js.map +1 -1
- package/dist-client/pages/checklist/checklist-view.js +3 -4
- package/dist-client/pages/checklist/checklist-view.js.map +1 -1
- package/dist-client/route.d.ts +1 -1
- package/dist-client/tsconfig.tsbuildinfo +1 -1
- package/package.json +2 -2
package/dist-client/pages/building-inspection/building-inspection-detail-ai-measurement.js.map
CHANGED
|
@@ -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 자동 검측\n *\n * 검측 체크리스트 항목을 AI 엔진(inspection-ai)에 보내:\n * 1) 촬영 가이드(plan-shots)를 받아 단계별 촬영 슬롯을 표시하고\n * 2) 촬영된 사진으로 자동 판정(inspect)을 실행한 뒤\n * 3) 항목별 상세 / 추가 촬영(재검사) / 종합 리포트를 거쳐\n * 4) 검사 등록 시 감리자 적합/부적합 자동 반영 + AI판단 근거를 첨부한다.\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')}`\nconst MAX_IMAGES = 8\n\n/* 엔진 verdict(기계값) → 화면 라벨. pass/fail만 합/불로 자동 체크, 나머지(보류/미지원/오류)는 감리자 판단 */\nconst VERDICT_LABEL = {\n pass: '적합',\n fail: '부적합',\n hold: '보류',\n pending: '미지원',\n error: '오류'\n}\n\n/* 엔진 routing(기계값) → 화면 라벨 */\nconst ROUTING_LABEL = {\n vlm: 'AI 사진판독',\n cv: '자동 측정',\n cv_missing: '자동 측정 누락'\n}\n\ntype PanelMode = 'none' | 'detail' | 'recapture' | 'report'\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 .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 .next-shot {\n font-size: 13px;\n font-weight: 700;\n color: #333;\n }\n\n .slot-grid {\n display: flex;\n gap: 8px;\n }\n\n .slot {\n flex: 1;\n aspect-ratio: 1;\n border: 1px dashed #ccc;\n border-radius: 8px;\n background: #fafafa;\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n gap: 4px;\n font-size: 12px;\n color: #999;\n text-align: center;\n padding: 4px;\n overflow: hidden;\n cursor: pointer;\n }\n\n .slot md-icon {\n --md-icon-size: 28px;\n color: #b5b5b5;\n }\n\n .slot img {\n width: 100%;\n height: 100%;\n object-fit: cover;\n border-radius: 6px;\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 .result-body {\n display: flex;\n gap: 14px;\n align-items: flex-start;\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 }\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 .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 /* ─── 우측 패널 (상세/재촬영/리포트) ─── */\n .side-pane {\n flex: 1;\n min-width: 280px;\n max-width: 360px;\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 .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 .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() photos: { file: File; url: string }[] = []\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 // 재촬영 패널 진입 시점의 사진 수\n @state() expandedReportId: string | null = null // 종합 리포트에서 펼친 항목(아코디언)\n\n @state() loading: boolean = false\n @state() loadingText: string = ''\n /** 뮤테이션 가능 여부('dcsp guest' 권한 보유 시 false) — 게스트에게는 생성/수정/삭제 버튼을 숨긴다 */\n @state() private canMutate = false\n\n @query('#photoInput') private photoInputEl!: HTMLInputElement\n\n async connectedCallback() {\n super.connectedCallback()\n this.canMutate = await canDcspMutate()\n this.updateContext()\n }\n\n /* 슬롯 클릭으로 선택기를 연 경우 대상 슬롯 인덱스 (null이면 뒤에 추가) */\n private pendingSlotIndex: number | null = null\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 .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\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 <!-- 모바일에서 촬영/앨범 선택이 함께 뜨도록 capture 속성 없이 사용 -->\n <input id=\"photoInput\" type=\"file\" accept=\"image/*\" multiple @change=${this._onPhotosSelected} />\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 taken = this.photos.length\n const current = shots[Math.min(taken, shots.length - 1)]\n const done = taken >= total\n\n return html`\n <div class=\"guide-container\">\n <div class=\"step-badge\">${Math.min(taken + 1, total)}단계 · ${current?.target || '촬영'}</div>\n <div class=\"guide-title\">${current?.target || ''}${done ? ' 촬영 완료' : ''}</div>\n <div class=\"guide-desc\">이 사진을 토대로 AI가 적용할 체크리스트를 결정하고 일부를 자동 판정합니다.</div>\n\n <div class=\"card\">\n <h4>촬영 가이드</h4>\n <ul>\n ${shots.map(s => html`<li>${s.target} — ${s.how}</li>`)}\n </ul>\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>${taken} / ${total}</span>\n </div>\n <div class=\"progress-bar\"><div style=\"width: ${total ? (taken / total) * 100 : 0}%\"></div></div>\n ${!done ? html`<div class=\"next-shot\">다음 촬영: ${current?.how || current?.target || ''}</div>` : ''}\n <div class=\"slot-grid\">\n ${shots.map(\n (s, i) => html`\n <div class=\"slot\" @click=${() => this._openPhotoPicker(i)}>\n ${\n this.photos[i]\n ? html`<img src=${this.photos[i].url} alt=${s.target} />`\n : html`<md-icon>add_a_photo</md-icon>${s.target}`\n }\n </div>\n `\n )}\n </div>\n </div>\n\n <button class=\"primary-button\" ?disabled=${taken === 0} @click=${() => this._runInspection()}>\n 사진 선택 ${taken ? `(${taken}/${total})` : ''}\n </button>\n ${\n taken > 0\n ? html`\n <div style=\"display: flex; justify-content: flex-end;\">\n <button class=\"text-button\" @click=${this._resetPhotos}>사진 초기화</button>\n </div>\n `\n : ''\n }\n </div>\n `\n }\n\n /* ─── 2단계: 판정 결과 화면 ─── */\n private _renderResult() {\n const items = this._sortedItems()\n const autoItems = items.filter(it => it.verdict === 'pass' || it.verdict === 'fail')\n const moreItems = items.filter(it => it.verdict !== 'pass' && it.verdict !== 'fail')\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 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}개 · 추가 촬영 ${moreItems.length}개\n </div>\n\n ${\n autoItems.length\n ? html`\n <div class=\"group-title\">자동 판정 완료 (${autoItems.length})</div>\n ${autoItems.map((it, i) => this._renderItemCard(it, i + 1))}\n `\n : ''\n }\n ${\n moreItems.length\n ? html`\n <div class=\"group-title\">추가 촬영 필요 (${moreItems.length} 남음)</div>\n ${moreItems.map((it, i) => this._renderItemCard(it, i + 1))}\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 auto = item.verdict === 'pass' || item.verdict === 'fail'\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 <span class=\"chip\">${ROUTING_LABEL[item.routing] || item.routing}</span>\n <span class=\"chip-verdict\">${VERDICT_LABEL[item.verdict] || item.verdict}</span>\n </div>\n <div class=\"item-desc\">${item.observation ? `관찰: ${item.observation}` : item.reason || ''}</div>\n </div>\n ${\n auto\n ? html`\n <div class=\"badge\" ?pass=${item.verdict === 'pass'} ?fail=${item.verdict === 'fail'}>\n ${VERDICT_LABEL[item.verdict]}\n </div>\n `\n : item.verdict === 'hold'\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 : html`<div class=\"badge\" etc>${VERDICT_LABEL[item.verdict] || item.verdict}</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 === '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 = VERDICT_LABEL[item.verdict] || item.verdict\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 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>${ROUTING_LABEL[item.routing] || item.routing || '-'}</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 <button class=\"text-button\" @click=${this._closePanel}>닫기</button>\n </div>\n `\n }\n\n private _renderRecapturePane(item: any) {\n const shots = item.recapture_shots?.length\n ? item.recapture_shots\n : [{ target: '추가 사진', how: '항목이 잘 보이도록 촬영해주세요.' }]\n const taken = this.photos.length - this.recaptureBase\n const total = shots.length\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 <div>\n <h4 style=\"margin: 0 0 8px 0; font-size: 13px;\">촬영 가이드</h4>\n <ul\n style=\"margin: 0; padding-left: 18px; font-size: 12px; color: #555; display: flex; flex-direction: column; gap: 6px;\"\n >\n ${shots.map(s => html`<li>${s.target} — ${s.how}</li>`)}\n </ul>\n </div>\n <div class=\"progress-row\">\n <span>사진 진행</span>\n <span>${Math.min(taken, total)} / ${total}</span>\n </div>\n <div class=\"progress-bar\"><div style=\"width: ${total ? Math.min(taken / total, 1) * 100 : 0}%\"></div></div>\n <div class=\"slot-grid\">\n ${shots.map((s, i) => {\n const photo = this.photos[this.recaptureBase + i]\n return html`\n <div class=\"slot\" @click=${() => this._openPhotoPicker(this.recaptureBase + i)}>\n ${photo ? html`<img src=${photo.url} alt=${s.target} />` : html`<md-icon>add_a_photo</md-icon>${s.target}`}\n </div>\n `\n })}\n </div>\n ${\n taken > 0\n ? html`<button class=\"primary-button\" @click=${() => this._runInspection()}>재검사 실행 (${taken}장)</button>`\n : ''\n }\n <button class=\"text-button\" @click=${this._closePanel}>닫기</button>\n </div>\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 ${VERDICT_LABEL[it.verdict] || it.verdict}\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\n ? html`<button class=\"primary-button\" @click=${this._registerInspection}>검사 등록</button>`\n : ''}\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 }\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 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 /* [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 } 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 /* [2단계] 자동 판정 실행 (inspect)\n * - 최초 판정: 전체 사진 + 전체 체크리스트\n * - 재검사(재촬영 패널): 이번에 새로 찍은 사진만 + 해당 항목만 재판정 후 결과 병합 */\n private async _runInspection() {\n const isRecapture = this.panel === 'recapture' && !!this.selectedItem\n // 재검사는 recaptureBase 이후에 찍은 사진만 전송\n const files = (isRecapture ? this.photos.slice(this.recaptureBase) : this.photos).map(p => p.file)\n if (!files.length) {\n notify({ message: '촬영된 사진이 없습니다.', level: 'warn' })\n return\n }\n const checklist = isRecapture\n ? this.engineChecklist.filter(c => c.item_id === this.selectedItem.item_id)\n : this.engineChecklist\n\n try {\n this.loading = true\n this.loadingText = 'AI 자동 판정 중... (최대 1~2분 소요)'\n const result = await this._callEngine({ action: 'inspect', checklist }, files)\n\n if (isRecapture) {\n this._mergeRecaptureResult(result)\n } else {\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 /* 재검사(부분 전송) 결과를 기존 전체 결과에 병합\n * - used_images는 전송한 부분집합 기준 1-based → 전체 사진 인덱스로 보정(recaptureBase 가산)\n * - 해당 항목만 교체 후 summary 재계산 */\n private _mergeRecaptureResult(result: any) {\n const base = this.recaptureBase\n const updated = (result?.items_sorted || result?.items || []).map((it: any) => ({\n ...it,\n used_images: (it.used_images || []).map((n: number) => n + base)\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 }\n for (const it of itemsSorted || items) summary[it.verdict] = (summary[it.verdict] || 0) + 1\n\n this.result = { ...this.result, items, ...(itemsSorted ? { items_sorted: itemsSorted } : {}), summary }\n }\n\n /* ─── 사진 선택 ─── */\n /* 슬롯 클릭 → 사진 선택기 열기 (모바일: 촬영/앨범 선택 팝업, 채워진 슬롯이면 교체) */\n private _openPhotoPicker(slotIndex: number | null = null) {\n this.pendingSlotIndex = slotIndex\n this.photoInputEl?.click()\n }\n\n private _onPhotosSelected(event: Event) {\n const input = event.target as HTMLInputElement\n const files = Array.from(input?.files || []).filter(f => f.type.startsWith('image/') || /\\.heic$/i.test(f.name))\n input.value = ''\n const slotIndex = this.pendingSlotIndex\n this.pendingSlotIndex = null\n if (!files.length) return\n\n // 채워진 슬롯을 클릭한 경우 → 해당 사진 교체 (첫 파일만 사용)\n if (slotIndex !== null && slotIndex < this.photos.length) {\n URL.revokeObjectURL(this.photos[slotIndex].url)\n const next = [...this.photos]\n next[slotIndex] = { file: files[0], url: URL.createObjectURL(files[0]) }\n this.photos = next\n return\n }\n\n // 빈 슬롯/추가 → 순서대로 뒤에 추가\n // 엔진 제한은 요청(호출)당 MAX_IMAGES장. 재검사는 새로 찍은 사진만 별도 전송되므로\n // 누적 합계가 아니라 이번 회차(최초=전체, 재검사=recaptureBase 이후) 기준으로만 제한한다.\n const batchBase = this.panel === 'recapture' ? this.recaptureBase : 0\n const cap = batchBase + MAX_IMAGES\n if (this.photos.length + files.length > cap) {\n notify({ message: `사진은 회차당 최대 ${MAX_IMAGES}장까지 사용할 수 있습니다.`, level: 'warn' })\n files.length = Math.max(0, cap - this.photos.length)\n if (!files.length) return\n }\n\n this.photos = [...this.photos, ...files.map(file => ({ file, url: URL.createObjectURL(file) }))]\n }\n\n private _resetPhotos = () => {\n this.photos.forEach(p => URL.revokeObjectURL(p.url))\n this.photos = []\n }\n\n private _resetAll() {\n this._resetPhotos()\n this.guide = null\n this.result = null\n this.panel = 'none'\n this.selectedItem = null\n this.mainPhotoIndex = 0\n this.recaptureBase = 0\n }\n\n /* ─── 패널 열기/닫기 ─── */\n private _openDetail(item: any) {\n // 보류(hold)는 추가 촬영이 필요한 케이스 → 상세 대신 추가 촬영 UI를 바로 표시\n if (item.verdict === 'hold') {\n this._openRecapture(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.recaptureBase = this.photos.length\n this.panel = 'recapture'\n }\n\n private _openReport = () => {\n this.panel = 'report'\n this.selectedItem = null\n this.expandedReportId = null\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 /* ─── [6단계] 검사 등록: 감리자 판정 자동 반영 + 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 if (judged.length) {\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\n if (response.errors) throw new Error(response.errors[0]?.message || '검사 등록에 실패했습니다.')\n }\n\n // 2) 항목별 첨부: 판단 근거(AI판단 텍스트) + 근거 사진 (판정 여부와 무관하게 전체 항목)\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 }\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/* 엔진 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 .picto-strip {\n display: flex;\n gap: 8px;\n margin-top: 10px;\n }\n\n .picto-strip img {\n flex: 1;\n min-width: 0;\n background: #fff;\n border: 1px solid #eee;\n border-radius: 8px;\n padding: 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 .result-body {\n display: flex;\n gap: 14px;\n align-items: flex-start;\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 }\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() 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 async connectedCallback() {\n super.connectedCallback()\n this.canMutate = await canDcspMutate()\n this.updateContext()\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 .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\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 <input\n id=\"setInput\"\n type=\"file\"\n accept=\".mov,.jsonl,.json,.zip,video/quicktime\"\n multiple\n @change=${this._onSetFilesSelected}\n />\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 class=\"picto-strip\">\n <img src=${pictoRebarImg} alt=\"철근: 재려는 변과 나란히\" />\n <img src=${pictoMemberImg} alt=\"기둥·벽: 모서리가 보이게\" />\n </div>\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._openSetPicker(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.technique ? ` (${set.technique})` : ''}\n ${set.warnings.map(w => html`<div class=\"set-warn\">⚠ ${w}</div>`)}`\n : html`탭해서 파일 3개(video.mov·poses.jsonl·meta.json)를 한 번에 선택`\n }\n </div>\n ${\n set\n ? html`<button\n class=\"text-button\"\n @click=${(e: Event) => {\n e.stopPropagation()\n this._openSetPicker(i)\n }}\n >\n 교체\n </button>`\n : ''\n }\n </div>\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 <span class=\"chip\">${ROUTING_LABEL[item.routing] || item.routing}</span>\n <span class=\"chip-verdict\">${this._verdictLabel(item)}</span>\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=\"set-card\" ?uploaded=${!!this.recaptureSet} @click=${() => this._openSetPicker(-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`앱으로 재촬영 후 파일 3개를 한 번에 선택`\n }\n </div>\n </div>\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 ? '측정 실행 (10~20초)' : '측정 시작 (약 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 }\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 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 } 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 /* ─── 세트 업로드 ─── */\n private _openSetPicker(index: number) {\n this.pendingSetIndex = index\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 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 const sets = this.uploadedSets\n if (!sets.length) {\n notify({ message: '업로드된 촬영 세트가 없습니다.', level: 'warn' })\n return\n }\n for (let i = 0; i < sets.length; i++) {\n newPhotos = [...newPhotos, ...(await this._fetchVlmFrames(sets[i], i))]\n }\n }\n\n const files = newPhotos.map(p => p.file)\n const checklist = isRecapture\n ? this.engineChecklist.filter(c => c.item_id === this.selectedItem.item_id)\n : this.engineChecklist\n\n this.loadingText = 'AI 자동 판정 중... (최대 1~2분 소요)'\n const result = await this._callEngine({ action: 'inspect', checklist, input_kind: 'video_frames' }, files)\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\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 = '측정 중... (이 프레임 첫 측정이면 10~20초)'\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 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 /* ─── 검사 등록: 감리자 판정 자동 반영 + 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 if (judged.length) {\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\n if (response.errors) throw new Error(response.errors[0]?.message || '검사 등록에 실패했습니다.')\n }\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"]}
|
|
@@ -879,11 +879,10 @@ ChecklistView.styles = [
|
|
|
879
879
|
background-color: #f0f7ff !important;
|
|
880
880
|
}
|
|
881
881
|
|
|
882
|
+
/* 플로팅 아님 — 체크리스트 상단 우측에 일반 배치(상단 고정) */
|
|
882
883
|
.stt-fab {
|
|
883
|
-
|
|
884
|
-
|
|
885
|
-
right: 20px;
|
|
886
|
-
z-index: 1;
|
|
884
|
+
align-self: flex-end;
|
|
885
|
+
margin-bottom: 4px;
|
|
887
886
|
}
|
|
888
887
|
|
|
889
888
|
.stt-fab[active] md-icon {
|