@dssp/dkpi 1.0.0-alpha.86 → 1.0.0-alpha.88

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.
Files changed (65) hide show
  1. package/_index.html +4 -4
  2. package/assets/helps/index.md +1 -1
  3. package/assets/manifest.json +2 -2
  4. package/dist-client/components/kpi-boxplot-chart.d.ts +7 -0
  5. package/dist-client/components/kpi-boxplot-chart.js +20 -5
  6. package/dist-client/components/kpi-boxplot-chart.js.map +1 -1
  7. package/dist-client/components/kpi-lookup-chart.js +1 -17
  8. package/dist-client/components/kpi-lookup-chart.js.map +1 -1
  9. package/dist-client/components/kpi-radar-chart.js +2 -2
  10. package/dist-client/components/kpi-radar-chart.js.map +1 -1
  11. package/dist-client/components/kpi-single-boxplot-chart.d.ts +7 -0
  12. package/dist-client/components/kpi-single-boxplot-chart.js +27 -26
  13. package/dist-client/components/kpi-single-boxplot-chart.js.map +1 -1
  14. package/dist-client/components/kpi-step-lookup-chart.d.ts +33 -0
  15. package/dist-client/components/kpi-step-lookup-chart.js +181 -0
  16. package/dist-client/components/kpi-step-lookup-chart.js.map +1 -0
  17. package/dist-client/components/kpi-trend-chart.js +2 -12
  18. package/dist-client/components/kpi-trend-chart.js.map +1 -1
  19. package/dist-client/google-map/common-google-map.js +5 -1
  20. package/dist-client/google-map/common-google-map.js.map +1 -1
  21. package/dist-client/pages/kpi-admin/dssp-kpi-overview.d.ts +2 -1
  22. package/dist-client/pages/kpi-admin/dssp-kpi-overview.js +24 -9
  23. package/dist-client/pages/kpi-admin/dssp-kpi-overview.js.map +1 -1
  24. package/dist-client/pages/kpi-admin/kpi-system-guide.js +311 -158
  25. package/dist-client/pages/kpi-admin/kpi-system-guide.js.map +1 -1
  26. package/dist-client/pages/kpi-dashboard/components/kpi-left-panel.d.ts +6 -0
  27. package/dist-client/pages/kpi-dashboard/components/kpi-left-panel.js +110 -50
  28. package/dist-client/pages/kpi-dashboard/components/kpi-left-panel.js.map +1 -1
  29. package/dist-client/pages/kpi-dashboard/components/kpi-map-panel.d.ts +0 -9
  30. package/dist-client/pages/kpi-dashboard/components/kpi-map-panel.js +6 -91
  31. package/dist-client/pages/kpi-dashboard/components/kpi-map-panel.js.map +1 -1
  32. package/dist-client/pages/kpi-dashboard/components/kpi-region-popup.d.ts +2 -0
  33. package/dist-client/pages/kpi-dashboard/components/kpi-region-popup.js +148 -68
  34. package/dist-client/pages/kpi-dashboard/components/kpi-region-popup.js.map +1 -1
  35. package/dist-client/pages/kpi-dashboard/kpi-dashboard-map.js +85 -41
  36. package/dist-client/pages/kpi-dashboard/kpi-dashboard-map.js.map +1 -1
  37. package/dist-client/pages/kpi-dashboard/kpi-dashboard.js +15 -7
  38. package/dist-client/pages/kpi-dashboard/kpi-dashboard.js.map +1 -1
  39. package/dist-client/pages/project-complete-tabs/pc-tab1-plan.js +16 -25
  40. package/dist-client/pages/project-complete-tabs/pc-tab1-plan.js.map +1 -1
  41. package/dist-client/pages/project-complete-tabs/pc-tab2-rating.js +9 -13
  42. package/dist-client/pages/project-complete-tabs/pc-tab2-rating.js.map +1 -1
  43. package/dist-client/pages/project-complete-tabs/pc-tab4-monthly.js +9 -15
  44. package/dist-client/pages/project-complete-tabs/pc-tab4-monthly.js.map +1 -1
  45. package/dist-client/pages/sv-project-complete.js +7 -11
  46. package/dist-client/pages/sv-project-complete.js.map +1 -1
  47. package/dist-client/pages/sv-project-completed-list.js +4 -4
  48. package/dist-client/pages/sv-project-completed-list.js.map +1 -1
  49. package/dist-client/pages/sv-project-detail.d.ts +1 -0
  50. package/dist-client/pages/sv-project-detail.js +94 -82
  51. package/dist-client/pages/sv-project-detail.js.map +1 -1
  52. package/dist-client/pages/sv-project-list.js +15 -12
  53. package/dist-client/pages/sv-project-list.js.map +1 -1
  54. package/dist-client/tsconfig.tsbuildinfo +1 -1
  55. package/dist-client/viewparts/menu-tools.js +17 -3
  56. package/dist-client/viewparts/menu-tools.js.map +1 -1
  57. package/dist-server/service/kpi-stat/kpi-stat-query.js +20 -19
  58. package/dist-server/service/kpi-stat/kpi-stat-query.js.map +1 -1
  59. package/dist-server/tsconfig.tsbuildinfo +1 -1
  60. package/openapi/unstable.yaml +2 -2
  61. package/package.json +3 -3
  62. package/schema.graphql +20 -0
  63. package/translations/ko.json +2 -2
  64. package/views/auth-page.html +4 -4
  65. package/views/public/home.html +5 -5
@@ -1 +1 @@
1
- {"version":3,"file":"kpi-dashboard.js","sourceRoot":"","sources":["../../../client/pages/kpi-dashboard/kpi-dashboard.ts"],"names":[],"mappings":"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","sourcesContent":["import { html, css, nothing } from 'lit'\nimport { customElement } from 'lit/decorators.js'\nimport { PageView } from '@operato/shell'\nimport { ScrollbarStyles } from '@operato/styles'\nimport { client } from '@operato/graphql'\nimport gql from 'graphql-tag'\nimport { state } from 'lit/decorators.js'\nimport '@material/web/icon/icon.js'\n\nimport './kpi-performance-summary'\nimport './kpi-grade-visualization'\nimport './kpi-history-viewer'\nimport './kpi-list-summary'\nimport './kpi-value-entry'\nimport './kpi-alert-panel'\nimport '../../components/kpi-radar-chart'\nimport '../../components/kpi-boxplot-chart'\n\n// 3레벨 KPI 플로팅 컴포넌트들\nimport './cards/kpi-level1-card'\nimport './cards/kpi-level2-comparison'\nimport './cards/kpi-level3-comparison'\n\n@customElement('kpi-dashboard')\nexport class KpiDashboardPage extends PageView {\n static styles = [\n ScrollbarStyles,\n css`\n :host {\n display: flex;\n flex-direction: column;\n overflow-y: auto;\n }\n .dashboard-root {\n flex: 1;\n padding: 24px;\n }\n .sample-charts-section {\n display: flex;\n flex-direction: column;\n gap: 40px;\n margin-bottom: 48px;\n align-items: flex-start;\n }\n .sample-chart-card {\n background: #fff;\n border-radius: 12px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06);\n border: 1px solid #ececec;\n padding: 24px 32px;\n min-width: 340px;\n flex: 1;\n display: flex;\n flex-direction: column;\n align-items: stretch;\n min-height: 500px;\n }\n .sample-chart-title {\n font-size: 1.1rem;\n font-weight: bold;\n margin-bottom: 12px;\n }\n .sample-chart-container {\n width: 100%;\n height: 340px;\n min-height: 340px;\n }\n .category-section {\n margin-bottom: 40px;\n }\n .category-title {\n font-size: 1.3rem;\n font-weight: bold;\n margin-bottom: 16px;\n }\n .kpi-cards {\n display: flex;\n gap: 24px;\n flex-wrap: wrap;\n }\n .kpi-card {\n background: #fff;\n border-radius: 12px;\n padding: 24px 32px;\n min-width: 220px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06);\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n margin-bottom: 8px;\n border: 1px solid #ececec;\n }\n .kpi-name {\n font-size: 1.1rem;\n font-weight: 500;\n margin-bottom: 8px;\n }\n .kpi-value {\n font-size: 2.2rem;\n font-weight: bold;\n color: #3a3ad6;\n margin-bottom: 4px;\n }\n .kpi-target {\n font-size: 1rem;\n color: #888;\n }\n `\n ]\n\n @state() categories: any[] = []\n @state() loading = true\n @state() error = ''\n @state() alerts: any[] = []\n @state() showHistoryModal: boolean = false\n @state() modalHistories: any[] = []\n @state() modalKpiName: string = ''\n @state() kpiStatistics: any[] = [] // 실제 KPI 통계 데이터\n @state() statisticsLoading = true // 통계 데이터 로딩 상태\n @state() selectedPeriodType: string = 'MONTH' // 선택된 기간 타입 (MONTH로 고정)\n @state() selectedValueDate: string = '' // 선택된 값 날짜\n @state() selectedSectorType: string = '' // 공공/민간 필터\n @state() selectedBuildingUsage: string = '' // 주거/비주거 필터\n\n // 샘플 데이터\n private get sampleCategories(): string[] {\n return ['생산성', '품질', '안전', '환경', '비용', '일정']\n }\n private get sampleGroups(): string[] {\n return ['A', 'B', 'C']\n }\n private get sampleSeriesData(): any[] {\n // 각 카테고리별로 10개 이상의 다양한 값(평균, 분산, 이상치 포함)\n // 생산성: 평균 높고 분산 큼, 이상치 포함\n const 생산성 = [95, 92, 90, 88, 85, 80, 78, 75, 70, 60, 100] // 100은 이상치\n // 품질: 평균 높고 분산 작음\n const 품질 = [90, 89, 88, 87, 86, 85, 84, 83, 82, 80, 70]\n // 안전: 평균 중간, 이상치 포함\n const 안전 = [92, 91, 90, 89, 88, 87, 86, 85, 84, 65, 60] // 60은 이상치\n // 환경: 낮은 값에 몰림, 분산 큼\n const 환경 = [95, 90, 85, 80, 75, 70, 65, 60, 60, 60, 55]\n // 비용: 전체적으로 낮음, 이상치 포함\n const 비용 = [80, 78, 76, 74, 72, 70, 68, 66, 64, 62, 50] // 50은 이상치\n // 일정: 분산 큼, 이상치 포함\n const 일정 = [90, 88, 86, 84, 82, 80, 78, 76, 74, 60, 100] // 100은 이상치\n\n const categories = this.sampleCategories\n const groups = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K']\n const all: any[] = []\n categories.forEach((cat, i) => {\n let arr: number[] = []\n switch (cat) {\n case '생산성':\n arr = 생산성\n break\n case '품질':\n arr = 품질\n break\n case '안전':\n arr = 안전\n break\n case '환경':\n arr = 환경\n break\n case '비용':\n arr = 비용\n break\n case '일정':\n arr = 일정\n break\n }\n arr.forEach((v, idx) => {\n all.push({ group: groups[idx] ?? `G${idx + 1}`, category: cat, value: v })\n })\n })\n return all\n }\n private get sampleRadarData(): any[] {\n // 카테고리별로 min, max, avg, A(자신의 그룹)만 반환\n const categories = this.sampleCategories\n const data = this.sampleSeriesData\n const minData: any = { group: 'Min' }\n const maxData: any = { group: 'Max' }\n const avgData: any = { group: 'Avg' }\n const aData: any = { group: 'A' }\n categories.forEach(category => {\n const values = data.filter(d => d.category === category).map(d => d.value)\n minData[category] = Math.min(...values)\n maxData[category] = Math.max(...values)\n avgData[category] = values.reduce((a, b) => a + b, 0) / values.length\n aData[category] = data.find(d => d.category === category && d.org === 'A')?.value ?? avgData[category]\n })\n // kpi-radar-chart가 기대하는 구조로 변환: [{org, category, value} ...]\n const result: any[] = []\n categories.forEach(category => {\n result.push({ org: 'Min', category, value: minData[category] })\n result.push({ org: 'Max', category, value: maxData[category] })\n result.push({ org: 'Avg', category, value: avgData[category] })\n result.push({ org: 'A', category, value: aData[category] })\n })\n return result\n }\n private get sampleRadarCategories(): string[] {\n return this.sampleCategories\n }\n private get sampleRadarGroups(): string[] {\n return this.sampleGroups\n }\n private get sampleBoxplotData(): any[] {\n // 카테고리별로 그룹별 value의 분포 계산\n const categories = this.sampleCategories\n const data = this.sampleSeriesData\n return categories.map(category => {\n const values = data.filter(d => d.category === category).map(d => d.value)\n const sorted = [...values].sort((a, b) => a - b)\n const min = sorted[0]\n const max = sorted[sorted.length - 1]\n const mean = values.reduce((a, b) => a + b, 0) / values.length\n const median =\n sorted.length % 2 === 0\n ? (sorted[sorted.length / 2 - 1] + sorted[sorted.length / 2]) / 2\n : sorted[Math.floor(sorted.length / 2)]\n const q1 = sorted[Math.floor(sorted.length / 4)]\n const q3 = sorted[Math.floor((sorted.length * 3) / 4)]\n // value: A그룹의 실제값(강조)\n const value = data.find(d => d.category === category && d.org === 'A')?.value ?? mean\n return {\n org: category, // x축: 카테고리\n min,\n q1,\n median,\n q3,\n max,\n mean,\n value\n }\n })\n }\n private get sampleBoxplotGroups(): string[] {\n return this.sampleCategories\n }\n private get sampleCurrentGroup() {\n return 'A'\n }\n\n // 현재 월을 YYYY-MM 형식으로 반환\n private get currentMonth(): string {\n const now = new Date()\n const year = now.getFullYear()\n const month = String(now.getMonth() + 1).padStart(2, '0')\n return `${year}-${month}`\n }\n\n // 필터링된 KPI 통계 데이터\n private get filteredKpiStatistics(): any[] {\n if (!this.kpiStatistics || this.kpiStatistics.length === 0) return []\n\n return this.kpiStatistics.filter(stat => stat.periodType === 'MONTH' && stat.valueDate === this.selectedValueDate)\n }\n\n // 사용 가능한 기간 타입들 (MONTH로 고정)\n private get availablePeriodTypes(): string[] {\n return ['MONTH']\n }\n\n // MONTH 기간에 사용 가능한 날짜들\n private get availableValueDates(): string[] {\n if (!this.kpiStatistics || this.kpiStatistics.length === 0) return []\n\n const valueDates = new Set<string>()\n this.kpiStatistics.forEach(stat => {\n if (stat.periodType === 'MONTH' && stat.valueDate) {\n valueDates.add(stat.valueDate)\n }\n })\n\n return Array.from(valueDates).sort().reverse() // 최신 날짜부터 정렬\n }\n\n // 통계 요약 정보\n private get statisticsSummary(): any {\n const filteredStats = this.filteredKpiStatistics\n if (filteredStats.length === 0) return null\n\n const totalKpis = filteredStats.length\n const categories = new Set(filteredStats.map(s => s.kpi?.category?.name).filter(Boolean))\n const totalCategories = categories.size\n\n const means = filteredStats.map(s => s.mean || 0).filter(v => v > 0)\n const medians = filteredStats.map(s => s.median || 0).filter(v => v > 0)\n const stdDevs = filteredStats.map(s => s.standardDeviation || 0).filter(v => v > 0)\n\n const avgMean = means.length > 0 ? means.reduce((a, b) => a + b, 0) / means.length : 0\n const avgMedian = medians.length > 0 ? medians.reduce((a, b) => a + b, 0) / medians.length : 0\n const avgStdDev = stdDevs.length > 0 ? stdDevs.reduce((a, b) => a + b, 0) / stdDevs.length : 0\n\n return {\n totalKpis,\n totalCategories,\n avgMean: avgMean.toFixed(2),\n avgMedian: avgMedian.toFixed(2),\n avgStdDev: avgStdDev.toFixed(2),\n periodType: this.selectedPeriodType,\n valueDate: this.selectedValueDate\n }\n }\n\n // 기간 타입 변경 핸들러 (사용하지 않음 - MONTH로 고정)\n private _onPeriodTypeChange(event: Event) {\n // MONTH로 고정되어 있으므로 변경하지 않음\n }\n\n // 날짜 변경 핸들러\n private _onValueDateChange(event: Event) {\n const target = event.target as HTMLSelectElement\n this.selectedValueDate = target.value\n }\n\n private _onSectorTypeChange(event: Event) {\n const target = event.target as HTMLSelectElement\n this.selectedSectorType = target.value\n }\n\n private _onBuildingUsageChange(event: Event) {\n const target = event.target as HTMLSelectElement\n this.selectedBuildingUsage = target.value\n }\n\n // 실제 KPI 통계 데이터를 기반으로 한 레이더 차트 데이터\n private get realKpiRadarData(): any[] {\n const filteredStats = this.filteredKpiStatistics\n if (filteredStats.length === 0) return []\n\n // 카테고리별로 통계 데이터 그룹화\n const categoryStats = new Map<string, any[]>()\n\n filteredStats.forEach(stat => {\n if (stat.kpi?.category?.name) {\n const categoryName = stat.kpi.category.name\n if (!categoryStats.has(categoryName)) {\n categoryStats.set(categoryName, [])\n }\n categoryStats.get(categoryName)!.push(stat)\n }\n })\n\n // 각 카테고리별로 평균, 중앙값, 표준편차 계산\n const result: any[] = []\n const categories = Array.from(categoryStats.keys())\n\n categories.forEach(category => {\n const stats = categoryStats.get(category)!\n const means = stats.map(s => s.mean || 0).filter(v => v > 0)\n const medians = stats.map(s => s.median || 0).filter(v => v > 0)\n const stdDevs = stats.map(s => s.standardDeviation || 0).filter(v => v > 0)\n\n if (means.length > 0) {\n result.push({ group: '평균', category, value: means.reduce((a, b) => a + b, 0) / means.length })\n }\n if (medians.length > 0) {\n result.push({ group: '중앙값', category, value: medians.reduce((a, b) => a + b, 0) / medians.length })\n }\n if (stdDevs.length > 0) {\n result.push({ group: '표준편차', category, value: stdDevs.reduce((a, b) => a + b, 0) / stdDevs.length })\n }\n })\n\n return result\n }\n\n private get realKpiRadarCategories(): string[] {\n const filteredStats = this.filteredKpiStatistics\n if (filteredStats.length === 0) return []\n\n const categories = new Set<string>()\n filteredStats.forEach(stat => {\n if (stat.kpi?.category?.name) {\n categories.add(stat.kpi.category.name)\n }\n })\n\n return Array.from(categories)\n }\n\n private get realKpiRadarGroups(): string[] {\n return ['평균', '중앙값', '표준편차']\n }\n\n // 실제 KPI 통계 데이터를 기반으로 한 박스플롯 데이터\n private get realKpiBoxplotData(): any[] {\n const filteredStats = this.filteredKpiStatistics\n if (filteredStats.length === 0) return []\n\n // 카테고리별로 통계 데이터 그룹화\n const categoryStats = new Map<string, any[]>()\n\n filteredStats.forEach(stat => {\n if (stat.kpi?.category?.name) {\n const categoryName = stat.kpi.category.name\n if (!categoryStats.has(categoryName)) {\n categoryStats.set(categoryName, [])\n }\n categoryStats.get(categoryName)!.push(stat)\n }\n })\n\n const result: any[] = []\n const categories = Array.from(categoryStats.keys())\n\n categories.forEach(category => {\n const stats = categoryStats.get(category)!\n\n // 각 KPI의 통계값들을 수집\n const allMeans = stats.map(s => s.mean || 0).filter(v => v > 0)\n const allMedians = stats.map(s => s.median || 0).filter(v => v > 0)\n const allMins = stats.map(s => s.minimum || 0).filter(v => v > 0)\n const allMaxs = stats.map(s => s.maximum || 0).filter(v => v > 0)\n const allQ1s = stats.map(s => s.percentile25 || 0).filter(v => v > 0)\n const allQ3s = stats.map(s => s.percentile75 || 0).filter(v => v > 0)\n\n if (allMeans.length > 0) {\n const sortedMeans = [...allMeans].sort((a, b) => a - b)\n const min = sortedMeans[0]\n const max = sortedMeans[sortedMeans.length - 1]\n const mean = allMeans.reduce((a, b) => a + b, 0) / allMeans.length\n const median = allMedians.length > 0 ? allMedians.reduce((a, b) => a + b, 0) / allMedians.length : mean\n\n const q1 = sortedMeans[Math.floor(sortedMeans.length / 4)]\n const q3 = sortedMeans[Math.floor((sortedMeans.length * 3) / 4)]\n\n result.push({\n group: category,\n min,\n q1,\n median,\n q3,\n max,\n mean,\n value: mean // 현재 값으로 평균 사용\n })\n }\n })\n\n return result\n }\n\n private get realKpiBoxplotGroups(): string[] {\n const filteredStats = this.filteredKpiStatistics\n if (filteredStats.length === 0) return []\n\n const categories = new Set<string>()\n filteredStats.forEach(stat => {\n if (stat.kpi?.category?.name) {\n categories.add(stat.kpi.category.name)\n }\n })\n\n return Array.from(categories)\n }\n\n private get realKpiCurrentGroup() {\n return '평균'\n }\n\n connectedCallback() {\n super.connectedCallback()\n this.fetchCategories()\n this.fetchKpiStatistics()\n }\n\n pageUpdated(changes: any, lifecycle: any) {\n if (this.active) {\n this.fetchCategories()\n this.fetchKpiStatistics()\n }\n }\n\n async fetchCategories() {\n this.loading = true\n this.error = ''\n try {\n const response = await client.query({\n query: gql`\n query {\n kpiCategories: kpisLevel1 {\n id\n name\n kpis: children {\n id\n name\n value {\n value\n valueDate\n }\n targetValue\n unit\n grades\n vizType\n vizMeta\n histories(limit: 1) {\n version\n updatedAt\n updater {\n name\n }\n }\n }\n }\n kpiAlerts {\n id\n kpi {\n id\n }\n message\n level\n createdAt\n }\n }\n `\n })\n this.categories = response.data.kpiCategories || []\n this.alerts = response.data.kpiAlerts || []\n } catch (e) {\n this.error = 'KPI 카테고리 데이터를 불러오지 못했습니다.'\n } finally {\n this.loading = false\n }\n }\n\n async fetchKpiStatistics() {\n this.statisticsLoading = true\n try {\n const response = await client.query({\n query: gql`\n query {\n kpiStatistics {\n items {\n id\n valueDate\n periodType\n count\n sum\n range\n mean\n median\n minimum\n maximum\n standardDeviation\n variance\n percentile25\n percentile75\n iqr\n lowerFence\n upperFence\n additionalStatistics\n metadata\n kpi {\n id\n name\n unit\n category: parent {\n id\n name\n }\n }\n }\n }\n }\n `\n })\n this.kpiStatistics = response.data.kpiStatistics.items || []\n\n // 현재 월을 기본값으로 설정\n const currentMonth = this.currentMonth\n const availableDates = this.availableValueDates\n\n if (availableDates.includes(currentMonth)) {\n // 현재 월 데이터가 있으면 현재 월로 설정\n this.selectedValueDate = currentMonth\n } else if (availableDates.length > 0) {\n // 현재 월 데이터가 없으면 가장 최근 데이터로 설정\n this.selectedValueDate = availableDates[0]\n } else {\n // 데이터가 없으면 현재 월로 설정\n this.selectedValueDate = currentMonth\n }\n } catch (e) {\n console.error('KPI 통계 데이터를 불러오지 못했습니다:', e)\n } finally {\n this.statisticsLoading = false\n }\n }\n\n async openHistoryModal(kpi) {\n // 전체 이력 fetch (limit 없이)\n try {\n const response = await client.query({\n query: gql`\n query ($kpiId: String!) {\n kpi(id: $kpiId) {\n name\n histories {\n version\n updatedAt\n updater {\n name\n }\n }\n }\n }\n `,\n variables: { kpiId: kpi.id }\n })\n this.modalHistories = response.data.kpi.histories || []\n this.modalKpiName = response.data.kpi.name || ''\n this.showHistoryModal = true\n } catch (e) {\n alert('이력 데이터를 불러오지 못했습니다.')\n }\n }\n closeHistoryModal() {\n this.showHistoryModal = false\n this.modalHistories = []\n this.modalKpiName = ''\n }\n\n _renderKpiValue(kpi: any) {\n const kpiValue = kpi.value?.value ?? 0\n const targetValue = kpi.targetValue ?? 100\n const unit = kpi.unit ?? ''\n const vizType = kpi.vizType || 'CARD'\n const vizMeta = kpi.vizMeta || {}\n const color = vizMeta.color || '#3a3ad6'\n const icon = vizMeta.icon || 'trending_up'\n const minValue = vizMeta.minValue || 0\n const maxValue = vizMeta.maxValue || 100\n const decimalPlaces = vizMeta.decimalPlaces || 0\n\n const formattedValue = typeof kpiValue === 'number' ? kpiValue.toFixed(decimalPlaces) : kpiValue\n\n switch (vizType) {\n case 'GAUGE':\n const gaugePercentage = Math.min(((kpiValue - minValue) / (maxValue - minValue)) * 100, 100)\n return html`\n <div style=\"text-align:center;margin:16px 0;\">\n <div\n style=\"width:120px;height:60px;border-radius:60px 60px 0 0;background:conic-gradient(${color} 0deg ${gaugePercentage *\n 3.6}deg, #e0e0e0 ${gaugePercentage * 3.6}deg 360deg);margin:0 auto;position:relative;\"\n >\n <div\n style=\"position:absolute;bottom:0;left:50%;transform:translateX(-50%);font-size:1.2rem;font-weight:bold;color:${color};\"\n >\n ${formattedValue}${unit}\n </div>\n </div>\n </div>\n `\n\n case 'PROGRESS':\n const progressPercentage = Math.min(((kpiValue - minValue) / (maxValue - minValue)) * 100, 100)\n return html`\n <div style=\"margin:16px 0;\">\n <div style=\"background:#e0e0e0;height:20px;border-radius:10px;overflow:hidden;\">\n <div style=\"background:${color};height:100%;width:${progressPercentage}%;transition:width 0.3s;\"></div>\n </div>\n <div style=\"text-align:center;margin-top:8px;font-weight:bold;color:${color};font-size:1.2rem;\">\n ${formattedValue}${unit}\n </div>\n </div>\n `\n\n case 'ICON':\n return html`\n <div style=\"text-align:center;margin:16px 0;\">\n <md-icon style=\"color:${color};font-size:48px;\">${icon}</md-icon>\n <div style=\"font-size:1.5rem;font-weight:bold;color:${color};margin-top:8px;\">${formattedValue}${unit}</div>\n </div>\n `\n\n case 'THERMOMETER':\n const thermoPercentage = Math.min(((kpiValue - minValue) / (maxValue - minValue)) * 100, 100)\n return html`\n <div style=\"text-align:center;margin:16px 0;\">\n <div\n style=\"width:40px;height:120px;background:#e0e0e0;border-radius:20px;margin:0 auto;position:relative;overflow:hidden;\"\n >\n <div\n style=\"position:absolute;bottom:0;width:100%;height:${thermoPercentage}%;background:${color};border-radius:20px;\"\n ></div>\n </div>\n <div style=\"font-size:1.2rem;font-weight:bold;color:${color};margin-top:8px;\">${formattedValue}${unit}</div>\n </div>\n `\n\n case 'SPEEDOMETER':\n const speedPercentage = Math.min(((kpiValue - minValue) / (maxValue - minValue)) * 100, 100)\n const angle = (speedPercentage / 100) * 180 - 90 // -90도에서 90도까지\n return html`\n <div style=\"text-align:center;margin:16px 0;\">\n <div\n style=\"width:120px;height:60px;border-radius:60px 60px 0 0;background:conic-gradient(${color} -90deg ${angle}deg, #e0e0e0 ${angle}deg 90deg);margin:0 auto;position:relative;\"\n >\n <div\n style=\"position:absolute;bottom:0;left:50%;transform:translateX(-50%);font-size:1.2rem;font-weight:bold;color:${color};\"\n >\n ${formattedValue}${unit}\n </div>\n </div>\n </div>\n `\n\n case 'BULLET':\n const bulletPercentage = Math.min(((kpiValue - minValue) / (maxValue - minValue)) * 100, 100)\n const targetPercentage = Math.min(((targetValue - minValue) / (maxValue - minValue)) * 100, 100)\n return html`\n <div style=\"margin:16px 0;\">\n <div style=\"background:#e0e0e0;height:30px;border-radius:15px;overflow:hidden;position:relative;\">\n <div style=\"background:${color};height:100%;width:${bulletPercentage}%;transition:width 0.3s;\"></div>\n <div style=\"position:absolute;top:0;left:${targetPercentage}%;width:2px;height:100%;background:#333;\"></div>\n </div>\n <div style=\"text-align:center;margin-top:8px;font-weight:bold;color:${color};font-size:1.2rem;\">\n ${formattedValue}${unit}\n </div>\n </div>\n `\n\n case 'TEXT':\n return html`\n <div style=\"text-align:center;margin:16px 0;\">\n <div style=\"font-size:1.5rem;font-weight:bold;color:${color};\">${formattedValue}${unit}</div>\n </div>\n `\n\n case 'BADGE':\n return html`\n <div style=\"text-align:center;margin:16px 0;\">\n <span\n style=\"display:inline-block;padding:8px 16px;background:${color};color:white;border-radius:20px;font-size:1.2rem;font-weight:bold;\"\n >${formattedValue}${unit}</span\n >\n </div>\n `\n\n default: // CARD, BAR, LINE, PIE, DONUT, RADAR, TABLE\n return html` <div class=\"kpi-value\">${formattedValue}${unit}</div> `\n }\n }\n\n get context() {\n return {\n title: 'KPI 대시보드',\n description: '조직 KPI 실적, 등급, 이력, 시각화 등 KPI 전용 대시보드'\n } as any\n }\n\n render() {\n if (this.loading) return nothing\n if (this.error) return html`<div>${this.error}</div>`\n return html`\n <div class=\"dashboard-root\">\n <!-- 샘플 차트 섹션 -->\n <div class=\"sample-charts-section\">\n <div class=\"sample-chart-card\">\n <div class=\"sample-chart-title\">그룹별 KPI 비교 (Radar)</div>\n <div class=\"sample-chart-container\">\n <sv-kpi-radar-chart\n .data=${this.sampleRadarData ?? []}\n .categories=${this.sampleRadarCategories ?? []}\n .currentGroup=${this.sampleCurrentGroup}\n ></sv-kpi-radar-chart>\n </div>\n <div style=\"margin-top:12px;color:#666;font-size:0.98em;\">\n ※ <b>Radar 차트</b>는 각 카테고리별로 최소(Min), 최대(Max), 평균(Avg), 그리고 이 프로젝트의 값을 한눈에 비교할 수\n 있도록 시각화합니다.<br />\n <b>진한 파란색</b> 다각형이 이 프로젝트의 성과이며, 회색 다각형은 기준값(최소/최대/평균)입니다.\n </div>\n </div>\n <div class=\"sample-chart-card\">\n <div class=\"sample-chart-title\">그룹별 분포 (Boxplot)</div>\n <div class=\"sample-chart-container\">\n <sv-kpi-boxplot-chart\n .data=${this.sampleBoxplotData ?? []}\n .groups=${this.sampleBoxplotGroups ?? []}\n .currentGroup=${this.sampleCurrentGroup}\n ></sv-kpi-boxplot-chart>\n </div>\n <div style=\"margin-top:12px;color:#666;font-size:0.98em;\">\n ※ <b>Boxplot(박스플롯)</b>은 각 카테고리별로 값의 분포(최소, 1사분위, 중앙값, 3사분위, 최대, 평균, 이상치 등)를\n 보여줍니다.<br />\n <b>박스</b>는 중앙 50% 구간, <b>수염</b>은 전체 범위, <b>굵은 검정색 가로선</b>은 중앙값(메디안), <b>주황색 원</b>은\n 평균값(Mean)을 의미합니다.<br />\n <b>이 프로젝트의 값</b>은 <b>진한 오렌지색 원</b>으로 별도 강조되어 표시되며, 중앙값/평균과 다를 수 있습니다.<br />\n </div>\n </div>\n </div>\n\n <!-- 실제 KPI 통계 차트 섹션 -->\n <div class=\"sample-charts-section\">\n <!-- 통계 필터 및 요약 -->\n <div style=\"margin-bottom: 24px; background: #f8f9fa; padding: 16px; border-radius: 8px;\">\n <div style=\"display: flex; gap: 16px; align-items: center; flex-wrap: wrap;\">\n <div style=\"display: flex; align-items: center; gap: 8px;\">\n <label style=\"font-weight: 500; color: #333;\">기간:</label>\n <span style=\"padding: 6px 12px; background: #e9ecef; border-radius: 4px; color: #495057;\"> MONTH (월별) </span>\n </div>\n <div style=\"display: flex; align-items: center; gap: 8px;\">\n <label style=\"font-weight: 500; color: #333;\">날짜:</label>\n <select\n .value=${this.selectedValueDate}\n @change=${this._onValueDateChange}\n style=\"padding: 6px 12px; border: 1px solid #ddd; border-radius: 4px; background: white;\"\n >\n ${this.availableValueDates.map(\n date => html`<option value=\"${date}\">${date}${date === this.currentMonth ? ' (현재)' : ''}</option>`\n )}\n </select>\n </div>\n ${this.statisticsSummary\n ? html`\n <div style=\"display: flex; gap: 16px; margin-left: auto;\">\n <span style=\"color: #666; font-size: 0.9em;\"> <b>KPI:</b> ${this.statisticsSummary.totalKpis}개 </span>\n <span style=\"color: #666; font-size: 0.9em;\">\n <b>카테고리:</b> ${this.statisticsSummary.totalCategories}개\n </span>\n <span style=\"color: #666; font-size: 0.9em;\"> <b>평균:</b> ${this.statisticsSummary.avgMean} </span>\n <span style=\"color: #666; font-size: 0.9em;\"> <b>중앙값:</b> ${this.statisticsSummary.avgMedian} </span>\n <span style=\"color: #666; font-size: 0.9em;\"> <b>표준편차:</b> ${this.statisticsSummary.avgStdDev} </span>\n </div>\n `\n : nothing}\n </div>\n </div>\n\n <div class=\"sample-chart-card\">\n <div class=\"sample-chart-title\">실제 KPI 통계 비교 (Radar)</div>\n <div class=\"sample-chart-container\">\n ${this.statisticsLoading\n ? html`<div style=\"display:flex;align-items:center;justify-content:center;height:100%;color:#666;\">\n 통계 데이터 로딩 중...\n </div>`\n : this.realKpiRadarData.length > 0\n ? html`<sv-kpi-radar-chart\n .data=${this.realKpiRadarData}\n .categories=${this.realKpiRadarCategories}\n .currentGroup=${'평균'}\n ></sv-kpi-radar-chart>`\n : html`<div style=\"display:flex;align-items:center;justify-content:center;height:100%;color:#666;\">\n 선택된 기간에 통계 데이터가 없습니다.\n </div>`}\n </div>\n <div style=\"margin-top:12px;color:#666;font-size:0.98em;\">\n ※ <b>실제 KPI 통계 Radar 차트</b>는 실제 KPIStatistic 데이터를 기반으로 각 카테고리별 평균, 중앙값, 표준편차를\n 비교합니다.<br />\n <b>평균</b>은 산술평균, <b>중앙값</b>은 50분위수, <b>표준편차</b>는 데이터 분산 정도를 나타냅니다.\n </div>\n </div>\n <div class=\"sample-chart-card\">\n <div class=\"sample-chart-title\">실제 KPI 통계 분포 (Boxplot)</div>\n <div class=\"sample-chart-container\">\n ${this.statisticsLoading\n ? html`<div style=\"display:flex;align-items:center;justify-content:center;height:100%;color:#666;\">\n 통계 데이터 로딩 중...\n </div>`\n : this.realKpiBoxplotData.length > 0\n ? html`<sv-kpi-boxplot-chart\n .data=${this.realKpiBoxplotData}\n .groups=${this.realKpiBoxplotGroups}\n .currentGroup=${'평균'}\n ></sv-kpi-boxplot-chart>`\n : html`<div style=\"display:flex;align-items:center;justify-content:center;height:100%;color:#666;\">\n 선택된 기간에 통계 데이터가 없습니다.\n </div>`}\n </div>\n <div style=\"margin-top:12px;color:#666;font-size:0.98em;\">\n ※ <b>실제 KPI 통계 Boxplot</b>은 실제 KPIStatistic 데이터를 기반으로 각 카테고리별 통계값의 분포를 보여줍니다.<br />\n 각 카테고리의 <b>평균값들</b>을 기준으로 분포를 계산하여, 카테고리 간 통계적 특성을 비교할 수 있습니다.\n </div>\n </div>\n </div>\n\n <!-- 3레벨 KPI 플로팅 섹션 -->\n <div class=\"sample-charts-section\">\n <div style=\"margin-bottom: 24px;\">\n <h2 style=\"font-size: 1.5rem; font-weight: bold; color: #333; text-align: center; margin-bottom: 8px;\">\n 3레벨 KPI 분석\n </h2>\n <p style=\"text-align: center; color: #666; font-size: 0.95rem;\">프로젝트 데이터 기반 다층적 KPI 성과 분석</p>\n </div>\n\n <!-- 프로젝트 속성 필터 -->\n <div style=\"margin-bottom: 24px; background: #f8f9fa; padding: 16px; border-radius: 8px; border: 1px solid #e9ecef;\">\n <div style=\"display: flex; gap: 16px; align-items: center; flex-wrap: wrap;\">\n <div style=\"display: flex; align-items: center; gap: 8px;\">\n <label style=\"font-weight: 500; color: #333; white-space: nowrap;\">사업 유형:</label>\n <select\n .value=${this.selectedSectorType}\n @change=${this._onSectorTypeChange}\n style=\"padding: 6px 12px; border: 1px solid #ddd; border-radius: 4px; background: white;\"\n >\n <option value=\"\">전체</option>\n <option value=\"PUBLIC\">공공</option>\n <option value=\"PRIVATE\">민간</option>\n </select>\n </div>\n <div style=\"display: flex; align-items: center; gap: 8px;\">\n <label style=\"font-weight: 500; color: #333; white-space: nowrap;\">건물 용도:</label>\n <select\n .value=${this.selectedBuildingUsage}\n @change=${this._onBuildingUsageChange}\n style=\"padding: 6px 12px; border: 1px solid #ddd; border-radius: 4px; background: white;\"\n >\n <option value=\"\">전체</option>\n <option value=\"RESIDENTIAL\">주거</option>\n <option value=\"NON_RESIDENTIAL\">비주거</option>\n </select>\n </div>\n ${this.selectedSectorType || this.selectedBuildingUsage\n ? html`<span style=\"color:#1976d2;font-size:0.9em;margin-left:8px;\">\n 필터 적용 중: ${[this.selectedSectorType === 'PUBLIC' ? '공공' : this.selectedSectorType === 'PRIVATE' ? '민간' : '', this.selectedBuildingUsage === 'RESIDENTIAL' ? '주거' : this.selectedBuildingUsage === 'NON_RESIDENTIAL' ? '비주거' : ''].filter(Boolean).join(' · ')}\n </span>`\n : nothing}\n </div>\n </div>\n\n <!-- 1레벨: 그룹 총 스코어 -->\n <div style=\"margin-bottom: 32px;\">\n <h3 style=\"font-size: 1.2rem; font-weight: 600; color: #495057; margin-bottom: 16px;\">📊 1레벨: 그룹 총 스코어</h3>\n <kpi-level1-card\n .sectorType=${this.selectedSectorType}\n .buildingUsage=${this.selectedBuildingUsage}\n ></kpi-level1-card>\n </div>\n\n <!-- 2레벨: 카테고리 비교 -->\n <div style=\"margin-bottom: 32px;\">\n <h3 style=\"font-size: 1.2rem; font-weight: 600; color: #495057; margin-bottom: 16px;\">\n 📈 2레벨: 카테고리 비교 분석\n </h3>\n <kpi-level2-comparison\n .sectorType=${this.selectedSectorType}\n .buildingUsage=${this.selectedBuildingUsage}\n ></kpi-level2-comparison>\n </div>\n\n <!-- 3레벨: 개별 KPI 비교 -->\n <div style=\"margin-bottom: 32px;\">\n <h3 style=\"font-size: 1.2rem; font-weight: 600; color: #495057; margin-bottom: 16px;\">\n 🔍 3레벨: 개별 KPI 상세 분석\n </h3>\n <kpi-level3-comparison\n .sectorType=${this.selectedSectorType}\n .buildingUsage=${this.selectedBuildingUsage}\n ></kpi-level3-comparison>\n </div>\n </div>\n ${this.showHistoryModal\n ? html`\n <div\n style=\"position:fixed;top:0;left:0;width:100vw;height:100vh;background:rgba(0,0,0,0.25);z-index:1000;display:flex;align-items:center;justify-content:center;\"\n >\n <div\n style=\"background:#fff;padding:32px 40px;border-radius:16px;min-width:340px;max-width:90vw;max-height:80vh;overflow:auto;box-shadow:0 4px 24px rgba(0,0,0,0.15);\"\n >\n <div style=\"font-size:1.2rem;font-weight:bold;margin-bottom:16px;\">${this.modalKpiName} 변경 이력</div>\n <ul style=\"padding:0;list-style:none;\">\n ${this.modalHistories.length === 0\n ? html`<li style=\"color:#bbb;\">이력이 없습니다.</li>`\n : this.modalHistories.map(\n h =>\n html`<li style=\"margin-bottom:8px;\">\n v${h.version} (${h.updatedAt?.slice(0, 10) ?? ''} ${h.updater?.name ?? ''})\n </li>`\n )}\n </ul>\n <button style=\"margin-top:16px;padding:6px 18px;\" @click=${() => this.closeHistoryModal()}>닫기</button>\n </div>\n </div>\n `\n : nothing}\n ${this.categories.map(\n cat => html`\n <div class=\"category-section\">\n <div class=\"category-title\">${cat.name}</div>\n <div class=\"kpi-cards\">\n ${(cat.kpis || []).map(\n kpi => html`\n <div class=\"kpi-card\">\n <div class=\"kpi-name\">${kpi.name}</div>\n ${this._renderKpiValue(kpi)}\n <div class=\"kpi-target\">목표: ${kpi.targetValue ?? '-'}${kpi.unit ?? ''}</div>\n <!-- 등급 시각화 -->\n <div style=\"margin-top:8px;\">\n <b>등급:</b>\n ${(() => {\n const grades = kpi.grades || []\n const kpiValue = kpi.value?.value\n\n if (grades.length > 5) {\n // 5개를 넘으면 현재 값에 해당하는 grade만 표시\n const currentGrade = grades.find(g => kpiValue >= g.minValue && kpiValue <= g.maxValue)\n if (currentGrade) {\n return html`<span\n style=\"display:inline-block;margin-right:8px;padding:4px 12px;border-radius:12px;background:${currentGrade.color ??\n '#3a3ad6'};color:white;font-size:1em;font-weight:bold;box-shadow:0 2px 8px rgba(58,58,214,0.3);border:2px solid ${currentGrade.color ??\n '#3a3ad6'};\"\n >${currentGrade.name}(${currentGrade.minValue}~${currentGrade.maxValue}${kpi.unit ?? ''},\n ${currentGrade.score ?? ''}점)</span\n >`\n } else {\n return html`<span style=\"color:#bbb;font-size:0.95em;\">등급 없음</span>`\n }\n } else {\n // 5개 이하면 전체 리스트 표시하되 현재 등급은 강조\n return grades.map(g => {\n const isCurrentGrade = kpiValue >= g.minValue && kpiValue <= g.maxValue\n return html`<span\n style=\"display:inline-block;margin-right:8px;padding:${isCurrentGrade\n ? '4px 12px'\n : '2px 8px'};border-radius:${isCurrentGrade ? '12px' : '8px'};background:${isCurrentGrade\n ? (g.color ?? '#3a3ad6')\n : (g.color ?? '#eee')};color:${isCurrentGrade ? 'white' : '#222'};font-size:${isCurrentGrade\n ? '1em'\n : '0.95em'};font-weight:${isCurrentGrade ? 'bold' : 'normal'};box-shadow:${isCurrentGrade\n ? '0 2px 8px rgba(58,58,214,0.3)'\n : 'none'};border:${isCurrentGrade ? `2px solid ${g.color ?? '#3a3ad6'}` : 'none'};\"\n >${g.name}(${g.minValue}~${g.maxValue}${kpi.unit ?? ''}, ${g.score ?? ''}점)</span\n >`\n })\n }\n })()}\n </div>\n <!-- 최근 변경 이력(1건만) -->\n <div style=\"margin-top:8px;font-size:0.95em;color:#888;\">\n <b>최근 변경:</b>\n ${kpi.histories && kpi.histories.length > 0\n ? html`<span style=\"margin-right:8px;\"\n >v${kpi.histories[0].version} (${kpi.histories[0].updatedAt?.slice(0, 10) ?? ''}\n ${kpi.histories[0].updater?.name ?? ''})</span\n >`\n : html`<span style=\"color:#bbb\">없음</span>`}\n <button\n style=\"margin-left:8px;font-size:0.95em;padding:2px 8px;\"\n @click=${() => this.openHistoryModal(kpi)}\n >\n 더보기\n </button>\n </div>\n <!-- 경고/알림 -->\n <div style=\"margin-top:8px;\">\n ${this.alerts.filter(a => a.kpi?.id === kpi.id).length > 0\n ? this.alerts\n .filter(a => a.kpi?.id === kpi.id)\n .map(\n a =>\n html`<span\n style=\"display:inline-block;margin-right:8px;padding:2px 8px;border-radius:8px;background:${a.level ===\n 'critical'\n ? '#ffb3b3'\n : a.level === 'warning'\n ? '#ffe082'\n : '#e0e0e0'};color:#b71c1c;font-size:0.95em;\"\n >${a.message}</span\n >`\n )\n : html`<span style=\"color:#4caf50;font-size:0.95em;\">이상/경고 없음</span>`}\n </div>\n </div>\n `\n )}\n </div>\n </div>\n `\n )}\n </div>\n `\n }\n}\n"]}
1
+ {"version":3,"file":"kpi-dashboard.js","sourceRoot":"","sources":["../../../client/pages/kpi-dashboard/kpi-dashboard.ts"],"names":[],"mappings":"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","sourcesContent":["import { html, css, nothing } from 'lit'\nimport { customElement } from 'lit/decorators.js'\nimport { PageView } from '@operato/shell'\nimport { ScrollbarStyles } from '@operato/styles'\nimport { client } from '@operato/graphql'\nimport gql from 'graphql-tag'\nimport { state } from 'lit/decorators.js'\nimport '@material/web/icon/icon.js'\n\nimport './kpi-performance-summary'\nimport './kpi-grade-visualization'\nimport './kpi-history-viewer'\nimport './kpi-list-summary'\nimport './kpi-value-entry'\nimport './kpi-alert-panel'\nimport '../../components/kpi-radar-chart'\nimport '../../components/kpi-boxplot-chart'\n\n// 3레벨 KPI 플로팅 컴포넌트들\nimport './cards/kpi-level1-card'\nimport './cards/kpi-level2-comparison'\nimport './cards/kpi-level3-comparison'\n\n@customElement('kpi-dashboard')\nexport class KpiDashboardPage extends PageView {\n static styles = [\n ScrollbarStyles,\n css`\n :host {\n display: flex;\n flex-direction: column;\n overflow-y: auto;\n }\n .dashboard-root {\n flex: 1;\n padding: 24px;\n }\n .sample-charts-section {\n display: flex;\n flex-direction: column;\n gap: 40px;\n margin-bottom: 48px;\n align-items: flex-start;\n }\n .sample-chart-card {\n background: #fff;\n border-radius: 12px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06);\n border: 1px solid #ececec;\n padding: 24px 32px;\n min-width: 340px;\n flex: 1;\n display: flex;\n flex-direction: column;\n align-items: stretch;\n min-height: 500px;\n }\n .sample-chart-title {\n font-size: 1.1rem;\n font-weight: bold;\n margin-bottom: 12px;\n }\n .sample-chart-container {\n width: 100%;\n height: 340px;\n min-height: 340px;\n }\n .category-section {\n margin-bottom: 40px;\n }\n .category-title {\n font-size: 1.3rem;\n font-weight: bold;\n margin-bottom: 16px;\n }\n .kpi-cards {\n display: flex;\n gap: 24px;\n flex-wrap: wrap;\n }\n .kpi-card {\n background: #fff;\n border-radius: 12px;\n padding: 24px 32px;\n min-width: 220px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06);\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n margin-bottom: 8px;\n border: 1px solid #ececec;\n }\n .kpi-name {\n font-size: 1.1rem;\n font-weight: 500;\n margin-bottom: 8px;\n }\n .kpi-value {\n font-size: 2.2rem;\n font-weight: bold;\n color: #3a3ad6;\n margin-bottom: 4px;\n }\n .kpi-target {\n font-size: 1rem;\n color: #888;\n }\n `\n ]\n\n @state() categories: any[] = []\n @state() loading = true\n @state() error = ''\n @state() alerts: any[] = []\n @state() showHistoryModal: boolean = false\n @state() modalHistories: any[] = []\n @state() modalKpiName: string = ''\n @state() kpiStatistics: any[] = [] // 실제 KPI 통계 데이터\n @state() statisticsLoading = true // 통계 데이터 로딩 상태\n @state() selectedPeriodType: string = 'MONTH' // 선택된 기간 타입 (MONTH로 고정)\n @state() selectedValueDate: string = '' // 선택된 값 날짜\n @state() selectedSectorType: string = '' // 공공/민간 필터\n @state() selectedBuildingUsage: string = '' // 주거/비주거 필터\n\n // 샘플 데이터\n private get sampleCategories(): string[] {\n return ['생산성', '품질', '안전', '환경', '비용', '일정']\n }\n private get sampleGroups(): string[] {\n return ['A', 'B', 'C']\n }\n private get sampleSeriesData(): any[] {\n // 각 카테고리별로 10개 이상의 다양한 값(평균, 분산, 이상치 포함)\n // 생산성: 평균 높고 분산 큼, 이상치 포함\n const 생산성 = [95, 92, 90, 88, 85, 80, 78, 75, 70, 60, 100] // 100은 이상치\n // 품질: 평균 높고 분산 작음\n const 품질 = [90, 89, 88, 87, 86, 85, 84, 83, 82, 80, 70]\n // 안전: 평균 중간, 이상치 포함\n const 안전 = [92, 91, 90, 89, 88, 87, 86, 85, 84, 65, 60] // 60은 이상치\n // 환경: 낮은 값에 몰림, 분산 큼\n const 환경 = [95, 90, 85, 80, 75, 70, 65, 60, 60, 60, 55]\n // 비용: 전체적으로 낮음, 이상치 포함\n const 비용 = [80, 78, 76, 74, 72, 70, 68, 66, 64, 62, 50] // 50은 이상치\n // 일정: 분산 큼, 이상치 포함\n const 일정 = [90, 88, 86, 84, 82, 80, 78, 76, 74, 60, 100] // 100은 이상치\n\n const categories = this.sampleCategories\n const groups = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K']\n const all: any[] = []\n categories.forEach((cat, i) => {\n let arr: number[] = []\n switch (cat) {\n case '생산성':\n arr = 생산성\n break\n case '품질':\n arr = 품질\n break\n case '안전':\n arr = 안전\n break\n case '환경':\n arr = 환경\n break\n case '비용':\n arr = 비용\n break\n case '일정':\n arr = 일정\n break\n }\n arr.forEach((v, idx) => {\n all.push({ group: groups[idx] ?? `G${idx + 1}`, category: cat, value: v })\n })\n })\n return all\n }\n private get sampleRadarData(): any[] {\n // 카테고리별로 min, max, avg, A(자신의 그룹)만 반환\n const categories = this.sampleCategories\n const data = this.sampleSeriesData\n const minData: any = { group: 'Min' }\n const maxData: any = { group: 'Max' }\n const avgData: any = { group: 'Avg' }\n const aData: any = { group: 'A' }\n categories.forEach(category => {\n const values = data.filter(d => d.category === category).map(d => d.value)\n minData[category] = Math.min(...values)\n maxData[category] = Math.max(...values)\n avgData[category] = values.reduce((a, b) => a + b, 0) / values.length\n aData[category] = data.find(d => d.category === category && d.org === 'A')?.value ?? avgData[category]\n })\n // kpi-radar-chart가 기대하는 구조로 변환: [{org, category, value} ...]\n const result: any[] = []\n categories.forEach(category => {\n result.push({ org: 'Min', category, value: minData[category] })\n result.push({ org: 'Max', category, value: maxData[category] })\n result.push({ org: 'Avg', category, value: avgData[category] })\n result.push({ org: 'A', category, value: aData[category] })\n })\n return result\n }\n private get sampleRadarCategories(): string[] {\n return this.sampleCategories\n }\n private get sampleRadarGroups(): string[] {\n return this.sampleGroups\n }\n private get sampleBoxplotData(): any[] {\n // 카테고리별로 그룹별 value의 분포 계산\n const categories = this.sampleCategories\n const data = this.sampleSeriesData\n return categories.map(category => {\n const values = data.filter(d => d.category === category).map(d => d.value)\n const sorted = [...values].sort((a, b) => a - b)\n const min = sorted[0]\n const max = sorted[sorted.length - 1]\n const mean = values.reduce((a, b) => a + b, 0) / values.length\n const median =\n sorted.length % 2 === 0\n ? (sorted[sorted.length / 2 - 1] + sorted[sorted.length / 2]) / 2\n : sorted[Math.floor(sorted.length / 2)]\n const q1 = sorted[Math.floor(sorted.length / 4)]\n const q3 = sorted[Math.floor((sorted.length * 3) / 4)]\n // value: A그룹의 실제값(강조)\n const value = data.find(d => d.category === category && d.org === 'A')?.value ?? mean\n return {\n org: category, // x축: 카테고리\n min,\n q1,\n median,\n q3,\n max,\n mean,\n value\n }\n })\n }\n private get sampleBoxplotGroups(): string[] {\n return this.sampleCategories\n }\n private get sampleCurrentGroup() {\n return 'A'\n }\n\n // 현재 월을 YYYY-MM 형식으로 반환\n private get currentMonth(): string {\n const now = new Date()\n const year = now.getFullYear()\n const month = String(now.getMonth() + 1).padStart(2, '0')\n return `${year}-${month}`\n }\n\n // 필터링된 KPI 통계 데이터\n private get filteredKpiStatistics(): any[] {\n if (!this.kpiStatistics || this.kpiStatistics.length === 0) return []\n\n return this.kpiStatistics.filter(stat => stat.periodType === 'MONTH' && stat.valueDate === this.selectedValueDate)\n }\n\n // 사용 가능한 기간 타입들 (MONTH로 고정)\n private get availablePeriodTypes(): string[] {\n return ['MONTH']\n }\n\n // MONTH 기간에 사용 가능한 날짜들\n private get availableValueDates(): string[] {\n if (!this.kpiStatistics || this.kpiStatistics.length === 0) return []\n\n const valueDates = new Set<string>()\n this.kpiStatistics.forEach(stat => {\n if (stat.periodType === 'MONTH' && stat.valueDate) {\n valueDates.add(stat.valueDate)\n }\n })\n\n return Array.from(valueDates).sort().reverse() // 최신 날짜부터 정렬\n }\n\n // 통계 요약 정보\n private get statisticsSummary(): any {\n const filteredStats = this.filteredKpiStatistics\n if (filteredStats.length === 0) return null\n\n const totalKpis = filteredStats.length\n const categories = new Set(filteredStats.map(s => s.kpi?.category?.name).filter(Boolean))\n const totalCategories = categories.size\n\n const means = filteredStats.map(s => s.mean || 0).filter(v => v > 0)\n const medians = filteredStats.map(s => s.median || 0).filter(v => v > 0)\n const stdDevs = filteredStats.map(s => s.standardDeviation || 0).filter(v => v > 0)\n\n const avgMean = means.length > 0 ? means.reduce((a, b) => a + b, 0) / means.length : 0\n const avgMedian = medians.length > 0 ? medians.reduce((a, b) => a + b, 0) / medians.length : 0\n const avgStdDev = stdDevs.length > 0 ? stdDevs.reduce((a, b) => a + b, 0) / stdDevs.length : 0\n\n return {\n totalKpis,\n totalCategories,\n avgMean: avgMean.toFixed(2),\n avgMedian: avgMedian.toFixed(2),\n avgStdDev: avgStdDev.toFixed(2),\n periodType: this.selectedPeriodType,\n valueDate: this.selectedValueDate\n }\n }\n\n // 기간 타입 변경 핸들러 (사용하지 않음 - MONTH로 고정)\n private _onPeriodTypeChange(event: Event) {\n // MONTH로 고정되어 있으므로 변경하지 않음\n }\n\n // 날짜 변경 핸들러\n private _onValueDateChange(event: Event) {\n const target = event.target as HTMLSelectElement\n this.selectedValueDate = target.value\n }\n\n private _onSectorTypeChange(event: Event) {\n const target = event.target as HTMLSelectElement\n this.selectedSectorType = target.value\n }\n\n private _onBuildingUsageChange(event: Event) {\n const target = event.target as HTMLSelectElement\n this.selectedBuildingUsage = target.value\n }\n\n // 실제 KPI 통계 데이터를 기반으로 한 레이더 차트 데이터\n private get realKpiRadarData(): any[] {\n const filteredStats = this.filteredKpiStatistics\n if (filteredStats.length === 0) return []\n\n // 카테고리별로 통계 데이터 그룹화\n const categoryStats = new Map<string, any[]>()\n\n filteredStats.forEach(stat => {\n if (stat.kpi?.category?.name) {\n const categoryName = stat.kpi.category.name\n if (!categoryStats.has(categoryName)) {\n categoryStats.set(categoryName, [])\n }\n categoryStats.get(categoryName)!.push(stat)\n }\n })\n\n // 각 카테고리별로 평균, 중앙값, 표준편차 계산\n const result: any[] = []\n const categories = Array.from(categoryStats.keys())\n\n categories.forEach(category => {\n const stats = categoryStats.get(category)!\n const means = stats.map(s => s.mean || 0).filter(v => v > 0)\n const medians = stats.map(s => s.median || 0).filter(v => v > 0)\n const stdDevs = stats.map(s => s.standardDeviation || 0).filter(v => v > 0)\n\n if (means.length > 0) {\n result.push({ group: '평균', category, value: means.reduce((a, b) => a + b, 0) / means.length })\n }\n if (medians.length > 0) {\n result.push({ group: '중앙값', category, value: medians.reduce((a, b) => a + b, 0) / medians.length })\n }\n if (stdDevs.length > 0) {\n result.push({ group: '표준편차', category, value: stdDevs.reduce((a, b) => a + b, 0) / stdDevs.length })\n }\n })\n\n return result\n }\n\n private get realKpiRadarCategories(): string[] {\n const filteredStats = this.filteredKpiStatistics\n if (filteredStats.length === 0) return []\n\n const categories = new Set<string>()\n filteredStats.forEach(stat => {\n if (stat.kpi?.category?.name) {\n categories.add(stat.kpi.category.name)\n }\n })\n\n return Array.from(categories)\n }\n\n private get realKpiRadarGroups(): string[] {\n return ['평균', '중앙값', '표준편차']\n }\n\n // 실제 KPI 통계 데이터를 기반으로 한 박스플롯 데이터\n private get realKpiBoxplotData(): any[] {\n const filteredStats = this.filteredKpiStatistics\n if (filteredStats.length === 0) return []\n\n // 카테고리별로 통계 데이터 그룹화\n const categoryStats = new Map<string, any[]>()\n\n filteredStats.forEach(stat => {\n if (stat.kpi?.category?.name) {\n const categoryName = stat.kpi.category.name\n if (!categoryStats.has(categoryName)) {\n categoryStats.set(categoryName, [])\n }\n categoryStats.get(categoryName)!.push(stat)\n }\n })\n\n const result: any[] = []\n const categories = Array.from(categoryStats.keys())\n\n categories.forEach(category => {\n const stats = categoryStats.get(category)!\n\n // 각 KPI의 통계값들을 수집\n const allMeans = stats.map(s => s.mean || 0).filter(v => v > 0)\n const allMedians = stats.map(s => s.median || 0).filter(v => v > 0)\n const allMins = stats.map(s => s.minimum || 0).filter(v => v > 0)\n const allMaxs = stats.map(s => s.maximum || 0).filter(v => v > 0)\n const allQ1s = stats.map(s => s.percentile25 || 0).filter(v => v > 0)\n const allQ3s = stats.map(s => s.percentile75 || 0).filter(v => v > 0)\n\n if (allMeans.length > 0) {\n const sortedMeans = [...allMeans].sort((a, b) => a - b)\n const min = sortedMeans[0]\n const max = sortedMeans[sortedMeans.length - 1]\n const mean = allMeans.reduce((a, b) => a + b, 0) / allMeans.length\n const median = allMedians.length > 0 ? allMedians.reduce((a, b) => a + b, 0) / allMedians.length : mean\n\n const q1 = sortedMeans[Math.floor(sortedMeans.length / 4)]\n const q3 = sortedMeans[Math.floor((sortedMeans.length * 3) / 4)]\n\n result.push({\n group: category,\n min,\n q1,\n median,\n q3,\n max,\n mean,\n value: mean // 현재 값으로 평균 사용\n })\n }\n })\n\n return result\n }\n\n private get realKpiBoxplotGroups(): string[] {\n const filteredStats = this.filteredKpiStatistics\n if (filteredStats.length === 0) return []\n\n const categories = new Set<string>()\n filteredStats.forEach(stat => {\n if (stat.kpi?.category?.name) {\n categories.add(stat.kpi.category.name)\n }\n })\n\n return Array.from(categories)\n }\n\n private get realKpiCurrentGroup() {\n return '평균'\n }\n\n connectedCallback() {\n super.connectedCallback()\n this.fetchCategories()\n this.fetchKpiStatistics()\n }\n\n pageUpdated(changes: any, lifecycle: any) {\n if (this.active) {\n this.fetchCategories()\n this.fetchKpiStatistics()\n }\n }\n\n async fetchCategories() {\n this.loading = true\n this.error = ''\n try {\n const response = await client.query({\n query: gql`\n query {\n kpiCategories: kpisLevel1 {\n id\n name\n kpis: children {\n id\n name\n value {\n value\n valueDate\n }\n targetValue\n unit\n grades\n vizType\n vizMeta\n histories(limit: 1) {\n version\n updatedAt\n updater {\n name\n }\n }\n }\n }\n kpiAlerts {\n id\n kpi {\n id\n }\n message\n level\n createdAt\n }\n }\n `\n })\n this.categories = response.data.kpiCategories || []\n this.alerts = response.data.kpiAlerts || []\n } catch (e) {\n this.error = 'KPI 카테고리 데이터를 불러오지 못했습니다.'\n } finally {\n this.loading = false\n }\n }\n\n async fetchKpiStatistics() {\n this.statisticsLoading = true\n try {\n const response = await client.query({\n query: gql`\n query {\n kpiStatistics {\n items {\n id\n valueDate\n periodType\n count\n sum\n range\n mean\n median\n minimum\n maximum\n standardDeviation\n variance\n percentile25\n percentile75\n iqr\n lowerFence\n upperFence\n additionalStatistics\n metadata\n kpi {\n id\n name\n unit\n category: parent {\n id\n name\n }\n }\n }\n }\n }\n `\n })\n this.kpiStatistics = response.data.kpiStatistics.items || []\n\n // 현재 월을 기본값으로 설정\n const currentMonth = this.currentMonth\n const availableDates = this.availableValueDates\n\n if (availableDates.includes(currentMonth)) {\n // 현재 월 데이터가 있으면 현재 월로 설정\n this.selectedValueDate = currentMonth\n } else if (availableDates.length > 0) {\n // 현재 월 데이터가 없으면 가장 최근 데이터로 설정\n this.selectedValueDate = availableDates[0]\n } else {\n // 데이터가 없으면 현재 월로 설정\n this.selectedValueDate = currentMonth\n }\n } catch (e) {\n console.error('KPI 통계 데이터를 불러오지 못했습니다:', e)\n } finally {\n this.statisticsLoading = false\n }\n }\n\n async openHistoryModal(kpi) {\n // 전체 이력 fetch (limit 없이)\n try {\n const response = await client.query({\n query: gql`\n query ($kpiId: String!) {\n kpi(id: $kpiId) {\n name\n histories {\n version\n updatedAt\n updater {\n name\n }\n }\n }\n }\n `,\n variables: { kpiId: kpi.id }\n })\n this.modalHistories = response.data.kpi.histories || []\n this.modalKpiName = response.data.kpi.name || ''\n this.showHistoryModal = true\n } catch (e) {\n alert('이력 데이터를 불러오지 못했습니다.')\n }\n }\n closeHistoryModal() {\n this.showHistoryModal = false\n this.modalHistories = []\n this.modalKpiName = ''\n }\n\n _renderKpiValue(kpi: any) {\n const kpiValue = kpi.value?.value ?? 0\n const targetValue = kpi.targetValue ?? 100\n const unit = kpi.unit ?? ''\n const vizType = kpi.vizType || 'CARD'\n const vizMeta = kpi.vizMeta || {}\n const color = vizMeta.color || '#3a3ad6'\n const icon = vizMeta.icon || 'trending_up'\n const minValue = vizMeta.minValue || 0\n const maxValue = vizMeta.maxValue || 100\n const decimalPlaces = vizMeta.decimalPlaces || 0\n\n const formattedValue = typeof kpiValue === 'number' ? kpiValue.toFixed(decimalPlaces) : kpiValue\n\n switch (vizType) {\n case 'GAUGE':\n const gaugePercentage = Math.min(((kpiValue - minValue) / (maxValue - minValue)) * 100, 100)\n return html`\n <div style=\"text-align:center;margin:16px 0;\">\n <div\n style=\"width:120px;height:60px;border-radius:60px 60px 0 0;background:conic-gradient(${color} 0deg ${gaugePercentage *\n 3.6}deg, #e0e0e0 ${gaugePercentage * 3.6}deg 360deg);margin:0 auto;position:relative;\"\n >\n <div\n style=\"position:absolute;bottom:0;left:50%;transform:translateX(-50%);font-size:1.2rem;font-weight:bold;color:${color};\"\n >\n ${formattedValue}${unit}\n </div>\n </div>\n </div>\n `\n\n case 'PROGRESS':\n const progressPercentage = Math.min(((kpiValue - minValue) / (maxValue - minValue)) * 100, 100)\n return html`\n <div style=\"margin:16px 0;\">\n <div style=\"background:#e0e0e0;height:20px;border-radius:10px;overflow:hidden;\">\n <div style=\"background:${color};height:100%;width:${progressPercentage}%;transition:width 0.3s;\"></div>\n </div>\n <div style=\"text-align:center;margin-top:8px;font-weight:bold;color:${color};font-size:1.2rem;\">\n ${formattedValue}${unit}\n </div>\n </div>\n `\n\n case 'ICON':\n return html`\n <div style=\"text-align:center;margin:16px 0;\">\n <md-icon style=\"color:${color};font-size:48px;\">${icon}</md-icon>\n <div style=\"font-size:1.5rem;font-weight:bold;color:${color};margin-top:8px;\">${formattedValue}${unit}</div>\n </div>\n `\n\n case 'THERMOMETER':\n const thermoPercentage = Math.min(((kpiValue - minValue) / (maxValue - minValue)) * 100, 100)\n return html`\n <div style=\"text-align:center;margin:16px 0;\">\n <div\n style=\"width:40px;height:120px;background:#e0e0e0;border-radius:20px;margin:0 auto;position:relative;overflow:hidden;\"\n >\n <div\n style=\"position:absolute;bottom:0;width:100%;height:${thermoPercentage}%;background:${color};border-radius:20px;\"\n ></div>\n </div>\n <div style=\"font-size:1.2rem;font-weight:bold;color:${color};margin-top:8px;\">${formattedValue}${unit}</div>\n </div>\n `\n\n case 'SPEEDOMETER':\n const speedPercentage = Math.min(((kpiValue - minValue) / (maxValue - minValue)) * 100, 100)\n const angle = (speedPercentage / 100) * 180 - 90 // -90도에서 90도까지\n return html`\n <div style=\"text-align:center;margin:16px 0;\">\n <div\n style=\"width:120px;height:60px;border-radius:60px 60px 0 0;background:conic-gradient(${color} -90deg ${angle}deg, #e0e0e0 ${angle}deg 90deg);margin:0 auto;position:relative;\"\n >\n <div\n style=\"position:absolute;bottom:0;left:50%;transform:translateX(-50%);font-size:1.2rem;font-weight:bold;color:${color};\"\n >\n ${formattedValue}${unit}\n </div>\n </div>\n </div>\n `\n\n case 'BULLET':\n const bulletPercentage = Math.min(((kpiValue - minValue) / (maxValue - minValue)) * 100, 100)\n const targetPercentage = Math.min(((targetValue - minValue) / (maxValue - minValue)) * 100, 100)\n return html`\n <div style=\"margin:16px 0;\">\n <div style=\"background:#e0e0e0;height:30px;border-radius:15px;overflow:hidden;position:relative;\">\n <div style=\"background:${color};height:100%;width:${bulletPercentage}%;transition:width 0.3s;\"></div>\n <div style=\"position:absolute;top:0;left:${targetPercentage}%;width:2px;height:100%;background:#333;\"></div>\n </div>\n <div style=\"text-align:center;margin-top:8px;font-weight:bold;color:${color};font-size:1.2rem;\">\n ${formattedValue}${unit}\n </div>\n </div>\n `\n\n case 'TEXT':\n return html`\n <div style=\"text-align:center;margin:16px 0;\">\n <div style=\"font-size:1.5rem;font-weight:bold;color:${color};\">${formattedValue}${unit}</div>\n </div>\n `\n\n case 'BADGE':\n return html`\n <div style=\"text-align:center;margin:16px 0;\">\n <span\n style=\"display:inline-block;padding:8px 16px;background:${color};color:white;border-radius:20px;font-size:1.2rem;font-weight:bold;\"\n >${formattedValue}${unit}</span\n >\n </div>\n `\n\n default: // CARD, BAR, LINE, PIE, DONUT, RADAR, TABLE\n return html` <div class=\"kpi-value\">${formattedValue}${unit}</div> `\n }\n }\n\n get context() {\n return {\n title: 'KPI 대시보드',\n description: '조직 KPI 실적, 등급, 이력, 시각화 등 KPI 전용 대시보드'\n } as any\n }\n\n render() {\n if (this.loading) return nothing\n if (this.error) return html`<div>${this.error}</div>`\n return html`\n <div class=\"dashboard-root\">\n <!-- 샘플 차트 섹션 -->\n <div class=\"sample-charts-section\">\n <div class=\"sample-chart-card\">\n <div class=\"sample-chart-title\">그룹별 KPI 비교 (Radar)</div>\n <div class=\"sample-chart-container\">\n <sv-kpi-radar-chart\n .data=${this.sampleRadarData ?? []}\n .categories=${this.sampleRadarCategories ?? []}\n .currentGroup=${this.sampleCurrentGroup}\n ></sv-kpi-radar-chart>\n </div>\n <div style=\"margin-top:12px;color:#666;font-size:0.98em;\">\n ※ <b>Radar 차트</b>는 각 카테고리별로 최소(Min), 최대(Max), 평균(Avg), 그리고 이 프로젝트의 값을 한눈에 비교할 수\n 있도록 시각화합니다.<br />\n <b>진한 파란색</b> 다각형이 이 프로젝트의 성과이며, 회색 다각형은 기준값(최소/최대/평균)입니다.\n </div>\n </div>\n <div class=\"sample-chart-card\">\n <div class=\"sample-chart-title\">성과영역별 KPI (Boxplot)</div>\n <div class=\"sample-chart-container\">\n <sv-kpi-boxplot-chart\n .data=${this.sampleBoxplotData ?? []}\n .groups=${this.sampleBoxplotGroups ?? []}\n .currentGroup=${this.sampleCurrentGroup}\n ></sv-kpi-boxplot-chart>\n </div>\n <div style=\"margin-top:12px;color:#666;font-size:0.98em;\">\n ※ <b>Boxplot(박스플롯)</b> <b>박스</b>는 중앙 50% 구간, <b>수염</b>은 전체 범위, <b>굵은 파란색 가로선</b>은\n 중앙값(메디안), <b>초록색 원</b>은 평균값(Mean)을 의미합니다.<br />\n <b>당해 프로젝트의 값</b>은 <b>붉은색 원</b>으로 표시됩니다.<br />\n </div>\n </div>\n </div>\n\n <!-- 실제 KPI 통계 차트 섹션 -->\n <div class=\"sample-charts-section\">\n <!-- 통계 필터 및 요약 -->\n <div style=\"margin-bottom: 24px; background: #f8f9fa; padding: 16px; border-radius: 8px;\">\n <div style=\"display: flex; gap: 16px; align-items: center; flex-wrap: wrap;\">\n <div style=\"display: flex; align-items: center; gap: 8px;\">\n <label style=\"font-weight: 500; color: #333;\">기간:</label>\n <span style=\"padding: 6px 12px; background: #e9ecef; border-radius: 4px; color: #495057;\"> MONTH (월별) </span>\n </div>\n <div style=\"display: flex; align-items: center; gap: 8px;\">\n <label style=\"font-weight: 500; color: #333;\">날짜:</label>\n <select\n .value=${this.selectedValueDate}\n @change=${this._onValueDateChange}\n style=\"padding: 6px 12px; border: 1px solid #ddd; border-radius: 4px; background: white;\"\n >\n ${this.availableValueDates.map(\n date => html`<option value=\"${date}\">${date}${date === this.currentMonth ? ' (현재)' : ''}</option>`\n )}\n </select>\n </div>\n ${this.statisticsSummary\n ? html`\n <div style=\"display: flex; gap: 16px; margin-left: auto;\">\n <span style=\"color: #666; font-size: 0.9em;\"> <b>KPI:</b> ${this.statisticsSummary.totalKpis}개 </span>\n <span style=\"color: #666; font-size: 0.9em;\">\n <b>카테고리:</b> ${this.statisticsSummary.totalCategories}개\n </span>\n <span style=\"color: #666; font-size: 0.9em;\"> <b>평균:</b> ${this.statisticsSummary.avgMean} </span>\n <span style=\"color: #666; font-size: 0.9em;\"> <b>중앙값:</b> ${this.statisticsSummary.avgMedian} </span>\n <span style=\"color: #666; font-size: 0.9em;\"> <b>표준편차:</b> ${this.statisticsSummary.avgStdDev} </span>\n </div>\n `\n : nothing}\n </div>\n </div>\n\n <div class=\"sample-chart-card\">\n <div class=\"sample-chart-title\">실제 KPI 통계 비교 (Radar)</div>\n <div class=\"sample-chart-container\">\n ${this.statisticsLoading\n ? html`<div style=\"display:flex;align-items:center;justify-content:center;height:100%;color:#666;\">\n 통계 데이터 로딩 중...\n </div>`\n : this.realKpiRadarData.length > 0\n ? html`<sv-kpi-radar-chart\n .data=${this.realKpiRadarData}\n .categories=${this.realKpiRadarCategories}\n .currentGroup=${'평균'}\n ></sv-kpi-radar-chart>`\n : html`<div style=\"display:flex;align-items:center;justify-content:center;height:100%;color:#666;\">\n 선택된 기간에 통계 데이터가 없습니다.\n </div>`}\n </div>\n <div style=\"margin-top:12px;color:#666;font-size:0.98em;\">\n ※ <b>실제 KPI 통계 Radar 차트</b>는 실제 KPIStatistic 데이터를 기반으로 각 카테고리별 평균, 중앙값, 표준편차를\n 비교합니다.<br />\n <b>평균</b>은 산술평균, <b>중앙값</b>은 50분위수, <b>표준편차</b>는 데이터 분산 정도를 나타냅니다.\n </div>\n </div>\n <div class=\"sample-chart-card\">\n <div class=\"sample-chart-title\">실제 KPI 통계 분포 (Boxplot)</div>\n <div class=\"sample-chart-container\">\n ${this.statisticsLoading\n ? html`<div style=\"display:flex;align-items:center;justify-content:center;height:100%;color:#666;\">\n 통계 데이터 로딩 중...\n </div>`\n : this.realKpiBoxplotData.length > 0\n ? html`<sv-kpi-boxplot-chart\n .data=${this.realKpiBoxplotData}\n .groups=${this.realKpiBoxplotGroups}\n .currentGroup=${'평균'}\n ></sv-kpi-boxplot-chart>`\n : html`<div style=\"display:flex;align-items:center;justify-content:center;height:100%;color:#666;\">\n 선택된 기간에 통계 데이터가 없습니다.\n </div>`}\n </div>\n <div style=\"margin-top:12px;color:#666;font-size:0.98em;\">\n ※ <b>실제 KPI 통계 Boxplot</b>은 실제 KPIStatistic 데이터를 기반으로 각 카테고리별 통계값의 분포를 보여줍니다.<br />\n 각 카테고리의 <b>평균값들</b>을 기준으로 분포를 계산하여, 카테고리 간 통계적 특성을 비교할 수 있습니다.\n </div>\n </div>\n </div>\n\n <!-- 3레벨 KPI 플로팅 섹션 -->\n <div class=\"sample-charts-section\">\n <div style=\"margin-bottom: 24px;\">\n <h2 style=\"font-size: 1.5rem; font-weight: bold; color: #333; text-align: center; margin-bottom: 8px;\">\n 3레벨 KPI 분석\n </h2>\n <p style=\"text-align: center; color: #666; font-size: 0.95rem;\">프로젝트 데이터 기반 다층적 KPI 성과 분석</p>\n </div>\n\n <!-- 프로젝트 속성 필터 -->\n <div style=\"margin-bottom: 24px; background: #f8f9fa; padding: 16px; border-radius: 8px; border: 1px solid #e9ecef;\">\n <div style=\"display: flex; gap: 16px; align-items: center; flex-wrap: wrap;\">\n <div style=\"display: flex; align-items: center; gap: 8px;\">\n <label style=\"font-weight: 500; color: #333; white-space: nowrap;\">사업 유형:</label>\n <select\n .value=${this.selectedSectorType}\n @change=${this._onSectorTypeChange}\n style=\"padding: 6px 12px; border: 1px solid #ddd; border-radius: 4px; background: white;\"\n >\n <option value=\"\">전체</option>\n <option value=\"PUBLIC\">공공</option>\n <option value=\"PRIVATE\">민간</option>\n </select>\n </div>\n <div style=\"display: flex; align-items: center; gap: 8px;\">\n <label style=\"font-weight: 500; color: #333; white-space: nowrap;\">건물 용도:</label>\n <select\n .value=${this.selectedBuildingUsage}\n @change=${this._onBuildingUsageChange}\n style=\"padding: 6px 12px; border: 1px solid #ddd; border-radius: 4px; background: white;\"\n >\n <option value=\"\">전체</option>\n <option value=\"RESIDENTIAL\">주거</option>\n <option value=\"NON_RESIDENTIAL\">비주거</option>\n </select>\n </div>\n ${this.selectedSectorType || this.selectedBuildingUsage\n ? html`<span style=\"color:#1976d2;font-size:0.9em;margin-left:8px;\">\n 필터 적용 중:\n ${[\n this.selectedSectorType === 'PUBLIC' ? '공공' : this.selectedSectorType === 'PRIVATE' ? '민간' : '',\n this.selectedBuildingUsage === 'RESIDENTIAL'\n ? '주거'\n : this.selectedBuildingUsage === 'NON_RESIDENTIAL'\n ? '비주거'\n : ''\n ]\n .filter(Boolean)\n .join(' · ')}\n </span>`\n : nothing}\n </div>\n </div>\n\n <!-- 1레벨: 그룹 총 스코어 -->\n <div style=\"margin-bottom: 32px;\">\n <h3 style=\"font-size: 1.2rem; font-weight: 600; color: #495057; margin-bottom: 16px;\">📊 1레벨: 그룹 총 스코어</h3>\n <kpi-level1-card\n .sectorType=${this.selectedSectorType}\n .buildingUsage=${this.selectedBuildingUsage}\n ></kpi-level1-card>\n </div>\n\n <!-- 2레벨: 카테고리 비교 -->\n <div style=\"margin-bottom: 32px;\">\n <h3 style=\"font-size: 1.2rem; font-weight: 600; color: #495057; margin-bottom: 16px;\">\n 📈 2레벨: 카테고리 비교 분석\n </h3>\n <kpi-level2-comparison\n .sectorType=${this.selectedSectorType}\n .buildingUsage=${this.selectedBuildingUsage}\n ></kpi-level2-comparison>\n </div>\n\n <!-- 3레벨: 개별 KPI 비교 -->\n <div style=\"margin-bottom: 32px;\">\n <h3 style=\"font-size: 1.2rem; font-weight: 600; color: #495057; margin-bottom: 16px;\">\n 🔍 3레벨: 개별 KPI 상세 분석\n </h3>\n <kpi-level3-comparison\n .sectorType=${this.selectedSectorType}\n .buildingUsage=${this.selectedBuildingUsage}\n ></kpi-level3-comparison>\n </div>\n </div>\n ${this.showHistoryModal\n ? html`\n <div\n style=\"position:fixed;top:0;left:0;width:100vw;height:100vh;background:rgba(0,0,0,0.25);z-index:1000;display:flex;align-items:center;justify-content:center;\"\n >\n <div\n style=\"background:#fff;padding:32px 40px;border-radius:16px;min-width:340px;max-width:90vw;max-height:80vh;overflow:auto;box-shadow:0 4px 24px rgba(0,0,0,0.15);\"\n >\n <div style=\"font-size:1.2rem;font-weight:bold;margin-bottom:16px;\">${this.modalKpiName} 변경 이력</div>\n <ul style=\"padding:0;list-style:none;\">\n ${this.modalHistories.length === 0\n ? html`<li style=\"color:#bbb;\">이력이 없습니다.</li>`\n : this.modalHistories.map(\n h =>\n html`<li style=\"margin-bottom:8px;\">\n v${h.version} (${h.updatedAt?.slice(0, 10) ?? ''} ${h.updater?.name ?? ''})\n </li>`\n )}\n </ul>\n <button style=\"margin-top:16px;padding:6px 18px;\" @click=${() => this.closeHistoryModal()}>닫기</button>\n </div>\n </div>\n `\n : nothing}\n ${this.categories.map(\n cat => html`\n <div class=\"category-section\">\n <div class=\"category-title\">${cat.name}</div>\n <div class=\"kpi-cards\">\n ${(cat.kpis || []).map(\n kpi => html`\n <div class=\"kpi-card\">\n <div class=\"kpi-name\">${kpi.name}</div>\n ${this._renderKpiValue(kpi)}\n <div class=\"kpi-target\">목표: ${kpi.targetValue ?? '-'}${kpi.unit ?? ''}</div>\n <!-- 등급 시각화 -->\n <div style=\"margin-top:8px;\">\n <b>등급:</b>\n ${(() => {\n const grades = kpi.grades || []\n const kpiValue = kpi.value?.value\n\n if (grades.length > 5) {\n // 5개를 넘으면 현재 값에 해당하는 grade만 표시\n const currentGrade = grades.find(g => kpiValue >= g.minValue && kpiValue <= g.maxValue)\n if (currentGrade) {\n return html`<span\n style=\"display:inline-block;margin-right:8px;padding:4px 12px;border-radius:12px;background:${currentGrade.color ??\n '#3a3ad6'};color:white;font-size:1em;font-weight:bold;box-shadow:0 2px 8px rgba(58,58,214,0.3);border:2px solid ${currentGrade.color ??\n '#3a3ad6'};\"\n >${currentGrade.name}(${currentGrade.minValue}~${currentGrade.maxValue}${kpi.unit ?? ''},\n ${currentGrade.score ?? ''}점)</span\n >`\n } else {\n return html`<span style=\"color:#bbb;font-size:0.95em;\">등급 없음</span>`\n }\n } else {\n // 5개 이하면 전체 리스트 표시하되 현재 등급은 강조\n return grades.map(g => {\n const isCurrentGrade = kpiValue >= g.minValue && kpiValue <= g.maxValue\n return html`<span\n style=\"display:inline-block;margin-right:8px;padding:${isCurrentGrade\n ? '4px 12px'\n : '2px 8px'};border-radius:${isCurrentGrade ? '12px' : '8px'};background:${isCurrentGrade\n ? (g.color ?? '#3a3ad6')\n : (g.color ?? '#eee')};color:${isCurrentGrade ? 'white' : '#222'};font-size:${isCurrentGrade\n ? '1em'\n : '0.95em'};font-weight:${isCurrentGrade ? 'bold' : 'normal'};box-shadow:${isCurrentGrade\n ? '0 2px 8px rgba(58,58,214,0.3)'\n : 'none'};border:${isCurrentGrade ? `2px solid ${g.color ?? '#3a3ad6'}` : 'none'};\"\n >${g.name}(${g.minValue}~${g.maxValue}${kpi.unit ?? ''}, ${g.score ?? ''}점)</span\n >`\n })\n }\n })()}\n </div>\n <!-- 최근 변경 이력(1건만) -->\n <div style=\"margin-top:8px;font-size:0.95em;color:#888;\">\n <b>최근 변경:</b>\n ${kpi.histories && kpi.histories.length > 0\n ? html`<span style=\"margin-right:8px;\"\n >v${kpi.histories[0].version} (${kpi.histories[0].updatedAt?.slice(0, 10) ?? ''}\n ${kpi.histories[0].updater?.name ?? ''})</span\n >`\n : html`<span style=\"color:#bbb\">없음</span>`}\n <button\n style=\"margin-left:8px;font-size:0.95em;padding:2px 8px;\"\n @click=${() => this.openHistoryModal(kpi)}\n >\n 더보기\n </button>\n </div>\n <!-- 경고/알림 -->\n <div style=\"margin-top:8px;\">\n ${this.alerts.filter(a => a.kpi?.id === kpi.id).length > 0\n ? this.alerts\n .filter(a => a.kpi?.id === kpi.id)\n .map(\n a =>\n html`<span\n style=\"display:inline-block;margin-right:8px;padding:2px 8px;border-radius:8px;background:${a.level ===\n 'critical'\n ? '#ffb3b3'\n : a.level === 'warning'\n ? '#ffe082'\n : '#e0e0e0'};color:#b71c1c;font-size:0.95em;\"\n >${a.message}</span\n >`\n )\n : html`<span style=\"color:#4caf50;font-size:0.95em;\">이상/경고 없음</span>`}\n </div>\n </div>\n `\n )}\n </div>\n </div>\n `\n )}\n </div>\n `\n }\n}\n"]}
@@ -12,7 +12,7 @@ const KPI_METRIC_KEY_MAPPING = [
12
12
  { label: '공사기간', projectKey: 'constructionPeriod' },
13
13
  { label: '총 근로자수', projectKey: 'totalWorkerCount' },
14
14
  { label: '연간 근로자 수', projectKey: 'annualWorkerCount' },
15
- { label: '투입인력', projectKey: 'workerCount' },
15
+ { label: '투입인력(M/M)', projectKey: 'workerCount' },
16
16
  { label: '재해 건수', projectKey: 'accidentCount' },
17
17
  { label: '일정 이탈 수준', projectKey: 'scheduleDeviationLevel' },
18
18
  { label: '총 건설 폐기물 발생량', projectKey: 'totalConstructionWasteAmount' },
@@ -81,9 +81,7 @@ let SvProjectCompleteTab1Plan = SvProjectCompleteTab1Plan_1 = class SvProjectCom
81
81
  // ALLTIME → 단일 ALLTIME row
82
82
  // 그 외 → metricId+periodType 매칭
83
83
  const kpiMetricValue = isMonthly
84
- ? this.kpiMetricValues.find((item) => item.metricId === metric.id &&
85
- item.periodType === 'MONTH' &&
86
- (item.valueDate || '').startsWith(lastMonth)) || {}
84
+ ? this.kpiMetricValues.find((item) => item.metricId === metric.id && item.periodType === 'MONTH' && (item.valueDate || '').startsWith(lastMonth)) || {}
87
85
  : this.kpiMetricValues.find((item) => item.metricId === metric.id && item.periodType === metric.periodType) || {};
88
86
  const isDisplayInput = projectKey === 'constructionPeriod' || projectKey === 'constructionCost'; // 유효한 계획 필드
89
87
  // planValue는 project에서 찾고 없으면 buildingComplex의 값에서 찾음
@@ -115,16 +113,15 @@ let SvProjectCompleteTab1Plan = SvProjectCompleteTab1Plan_1 = class SvProjectCom
115
113
  // periodType 무관하게 값 없으면 pending. 메시지는 MONTH 만 "전월 데이터 입력 필요".
116
114
  const isPending = kpiMetricValue.value === undefined || kpiMetricValue.value === null;
117
115
  return html `<div class="row">
118
- <div class="label ${isPending ? 'pending' : ''}"
119
- title=${isPending
120
- ? isMonthly
121
- ? '전월 데이터 입력 필요'
122
- : '아직 입력되지 않은 항목'
123
- : ''}>${metric.name}</div>
116
+ <div
117
+ class="label ${isPending ? 'pending' : ''}"
118
+ title=${isPending ? (isMonthly ? '전월 데이터 입력 필요' : '아직 입력되지 않은 항목') : ''}
119
+ >
120
+ ${metric.name}
121
+ </div>
124
122
  <div class="cell ${this.justFilled[metric.id] ? 'just-filled' : ''} ${isPending ? 'pending' : ''}">
125
123
  <input numeric .value=${actualValue !== null && actualValue !== void 0 ? actualValue : 0} @input=${(e) => this._onInputChange(e, metric)} />
126
- ${unit}
127
- ${src ? html `<span class="src-chip">🔗 ${src}</span>` : ''}
124
+ ${unit} ${src ? html `<span class="src-chip">🔗 ${src}</span>` : ''}
128
125
  </div>
129
126
  <div class="desc">${metric.description || ''}</div>
130
127
  </div>`;
@@ -152,7 +149,7 @@ let SvProjectCompleteTab1Plan = SvProjectCompleteTab1Plan_1 = class SvProjectCom
152
149
  class="collect-btn ${this.canAutoCollect ? '' : 'disabled'}"
153
150
  ?disabled=${this.collecting}
154
151
  title=${this.canAutoCollect ? '' : 'kpi:auto-collect 권한 필요'}
155
- @click=${() => this.canAutoCollect && !this.collecting ? this._autoCollect() : null}
152
+ @click=${() => (this.canAutoCollect && !this.collecting ? this._autoCollect() : null)}
156
153
  >
157
154
  ${this.collecting ? '수집 중…' : '⟳ 자동 수집'}
158
155
  </div>
@@ -164,13 +161,7 @@ let SvProjectCompleteTab1Plan = SvProjectCompleteTab1Plan_1 = class SvProjectCom
164
161
  // 카드 안의 수집 필드 summary — 실제/계획 무관 collectedSummary 기준으로 통일.
165
162
  // (valueSources 만 보면 키스콘처럼 계획값만 채우는 시스템은 표시 안 됨)
166
163
  const collectedFields = this._collectedFieldsOf(meta.label);
167
- const statusText = status === 'collecting'
168
- ? '연동 중…'
169
- : status === 'done'
170
- ? '완료 ✓'
171
- : status === 'error'
172
- ? '정보 없음 ⓘ'
173
- : '대기';
164
+ const statusText = status === 'collecting' ? '연동 중…' : status === 'done' ? '완료 ✓' : status === 'error' ? '정보 없음 ⓘ' : '대기';
174
165
  return html `
175
166
  <div class="source-card ${status}">
176
167
  <div class="sc-head">
@@ -239,7 +230,7 @@ let SvProjectCompleteTab1Plan = SvProjectCompleteTab1Plan_1 = class SvProjectCom
239
230
  const summary = [];
240
231
  // KPI_METRIC_KEY_MAPPING 에 없는 키들의 한글 라벨. BuildingComplex/Project 직접 속성용.
241
232
  const NON_KPI_LABEL = {
242
- siteType: '건축현장유형',
233
+ siteType: '건축프로젝트유형',
243
234
  structureType: '구조형태',
244
235
  coverageRatio: '건폐율',
245
236
  householdCount: '세대수',
@@ -395,9 +386,7 @@ let SvProjectCompleteTab1Plan = SvProjectCompleteTab1Plan_1 = class SvProjectCom
395
386
  const lastMonth = today.clone().subtract(1, 'month');
396
387
  const lastMonth1 = lastMonth.format('YYYY-MM-01');
397
388
  const lastMonthYm = lastMonth.format('YYYY-MM');
398
- const idx = updated.findIndex((i) => i.metricId === metric.id &&
399
- i.periodType === 'MONTH' &&
400
- (i.valueDate || '').startsWith(lastMonthYm));
389
+ const idx = updated.findIndex((i) => i.metricId === metric.id && i.periodType === 'MONTH' && (i.valueDate || '').startsWith(lastMonthYm));
401
390
  if (idx !== -1) {
402
391
  updated[idx] = Object.assign(Object.assign({}, updated[idx]), { value });
403
392
  }
@@ -616,7 +605,9 @@ SvProjectCompleteTab1Plan.styles = [
616
605
  border-radius: 7px;
617
606
  padding: 10px 12px;
618
607
  background: #fff;
619
- transition: border-color 0.2s, box-shadow 0.2s;
608
+ transition:
609
+ border-color 0.2s,
610
+ box-shadow 0.2s;
620
611
  }
621
612
  .source-card.collecting {
622
613
  border-color: #2e79be;