@dssp/dkpi 1.0.0-alpha.99 → 1.0.0

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 (236) hide show
  1. package/package.json +55 -55
  2. package/dist-client/bootstrap.d.ts +0 -9
  3. package/dist-client/bootstrap.js +0 -272
  4. package/dist-client/bootstrap.js.map +0 -1
  5. package/dist-client/components/kpi-2d-lookup-chart.d.ts +0 -50
  6. package/dist-client/components/kpi-2d-lookup-chart.js +0 -263
  7. package/dist-client/components/kpi-2d-lookup-chart.js.map +0 -1
  8. package/dist-client/components/kpi-boxplot-chart.d.ts +0 -31
  9. package/dist-client/components/kpi-boxplot-chart.js +0 -306
  10. package/dist-client/components/kpi-boxplot-chart.js.map +0 -1
  11. package/dist-client/components/kpi-lookup-chart.d.ts +0 -58
  12. package/dist-client/components/kpi-lookup-chart.js +0 -464
  13. package/dist-client/components/kpi-lookup-chart.js.map +0 -1
  14. package/dist-client/components/kpi-mini-trend-chart.d.ts +0 -14
  15. package/dist-client/components/kpi-mini-trend-chart.js +0 -180
  16. package/dist-client/components/kpi-mini-trend-chart.js.map +0 -1
  17. package/dist-client/components/kpi-radar-chart.d.ts +0 -17
  18. package/dist-client/components/kpi-radar-chart.js +0 -259
  19. package/dist-client/components/kpi-radar-chart.js.map +0 -1
  20. package/dist-client/components/kpi-single-boxplot-chart.d.ts +0 -36
  21. package/dist-client/components/kpi-single-boxplot-chart.js +0 -417
  22. package/dist-client/components/kpi-single-boxplot-chart.js.map +0 -1
  23. package/dist-client/components/kpi-step-lookup-chart.d.ts +0 -33
  24. package/dist-client/components/kpi-step-lookup-chart.js +0 -181
  25. package/dist-client/components/kpi-step-lookup-chart.js.map +0 -1
  26. package/dist-client/components/kpi-trend-chart.d.ts +0 -25
  27. package/dist-client/components/kpi-trend-chart.js +0 -241
  28. package/dist-client/components/kpi-trend-chart.js.map +0 -1
  29. package/dist-client/components/sv-pagenation-control.d.ts +0 -18
  30. package/dist-client/components/sv-pagenation-control.js +0 -142
  31. package/dist-client/components/sv-pagenation-control.js.map +0 -1
  32. package/dist-client/entries/auth/checkin.d.ts +0 -38
  33. package/dist-client/entries/auth/checkin.js +0 -551
  34. package/dist-client/entries/auth/checkin.js.map +0 -1
  35. package/dist-client/entries/public/home.d.ts +0 -8
  36. package/dist-client/entries/public/home.js +0 -97
  37. package/dist-client/entries/public/home.js.map +0 -1
  38. package/dist-client/google-map/common-google-map.d.ts +0 -35
  39. package/dist-client/google-map/common-google-map.js +0 -349
  40. package/dist-client/google-map/common-google-map.js.map +0 -1
  41. package/dist-client/google-map/google-map-loader.d.ts +0 -6
  42. package/dist-client/google-map/google-map-loader.js +0 -23
  43. package/dist-client/google-map/google-map-loader.js.map +0 -1
  44. package/dist-client/icons/menu-icons.d.ts +0 -11
  45. package/dist-client/icons/menu-icons.js +0 -126
  46. package/dist-client/icons/menu-icons.js.map +0 -1
  47. package/dist-client/index.d.ts +0 -0
  48. package/dist-client/index.js +0 -2
  49. package/dist-client/index.js.map +0 -1
  50. package/dist-client/menu.d.ts +0 -23
  51. package/dist-client/menu.js +0 -59
  52. package/dist-client/menu.js.map +0 -1
  53. package/dist-client/pages/component/project-update-header.d.ts +0 -1
  54. package/dist-client/pages/component/project-update-header.js +0 -127
  55. package/dist-client/pages/component/project-update-header.js.map +0 -1
  56. package/dist-client/pages/kpi-admin/dssp-kpi-list-page.d.ts +0 -22
  57. package/dist-client/pages/kpi-admin/dssp-kpi-list-page.js +0 -57
  58. package/dist-client/pages/kpi-admin/dssp-kpi-list-page.js.map +0 -1
  59. package/dist-client/pages/kpi-admin/dssp-kpi-overview.d.ts +0 -47
  60. package/dist-client/pages/kpi-admin/dssp-kpi-overview.js +0 -393
  61. package/dist-client/pages/kpi-admin/dssp-kpi-overview.js.map +0 -1
  62. package/dist-client/pages/kpi-admin/kpi-grade-2d-editor.d.ts +0 -20
  63. package/dist-client/pages/kpi-admin/kpi-grade-2d-editor.js +0 -445
  64. package/dist-client/pages/kpi-admin/kpi-grade-2d-editor.js.map +0 -1
  65. package/dist-client/pages/kpi-admin/kpi-system-guide.d.ts +0 -18
  66. package/dist-client/pages/kpi-admin/kpi-system-guide.js +0 -696
  67. package/dist-client/pages/kpi-admin/kpi-system-guide.js.map +0 -1
  68. package/dist-client/pages/kpi-dashboard/cards/kpi-level1-card.d.ts +0 -18
  69. package/dist-client/pages/kpi-dashboard/cards/kpi-level1-card.js +0 -259
  70. package/dist-client/pages/kpi-dashboard/cards/kpi-level1-card.js.map +0 -1
  71. package/dist-client/pages/kpi-dashboard/cards/kpi-level2-comparison.d.ts +0 -22
  72. package/dist-client/pages/kpi-dashboard/cards/kpi-level2-comparison.js +0 -346
  73. package/dist-client/pages/kpi-dashboard/cards/kpi-level2-comparison.js.map +0 -1
  74. package/dist-client/pages/kpi-dashboard/cards/kpi-level3-comparison.d.ts +0 -26
  75. package/dist-client/pages/kpi-dashboard/cards/kpi-level3-comparison.js +0 -433
  76. package/dist-client/pages/kpi-dashboard/cards/kpi-level3-comparison.js.map +0 -1
  77. package/dist-client/pages/kpi-dashboard/components/kpi-chart-toggle.d.ts +0 -8
  78. package/dist-client/pages/kpi-dashboard/components/kpi-chart-toggle.js +0 -78
  79. package/dist-client/pages/kpi-dashboard/components/kpi-chart-toggle.js.map +0 -1
  80. package/dist-client/pages/kpi-dashboard/components/kpi-left-panel.d.ts +0 -46
  81. package/dist-client/pages/kpi-dashboard/components/kpi-left-panel.js +0 -945
  82. package/dist-client/pages/kpi-dashboard/components/kpi-left-panel.js.map +0 -1
  83. package/dist-client/pages/kpi-dashboard/components/kpi-map-panel.d.ts +0 -34
  84. package/dist-client/pages/kpi-dashboard/components/kpi-map-panel.js +0 -238
  85. package/dist-client/pages/kpi-dashboard/components/kpi-map-panel.js.map +0 -1
  86. package/dist-client/pages/kpi-dashboard/components/kpi-region-popup.d.ts +0 -37
  87. package/dist-client/pages/kpi-dashboard/components/kpi-region-popup.js +0 -689
  88. package/dist-client/pages/kpi-dashboard/components/kpi-region-popup.js.map +0 -1
  89. package/dist-client/pages/kpi-dashboard/kpi-alert-panel.d.ts +0 -18
  90. package/dist-client/pages/kpi-dashboard/kpi-alert-panel.js +0 -131
  91. package/dist-client/pages/kpi-dashboard/kpi-alert-panel.js.map +0 -1
  92. package/dist-client/pages/kpi-dashboard/kpi-dashboard-map.d.ts +0 -57
  93. package/dist-client/pages/kpi-dashboard/kpi-dashboard-map.js +0 -866
  94. package/dist-client/pages/kpi-dashboard/kpi-dashboard-map.js.map +0 -1
  95. package/dist-client/pages/kpi-dashboard/kpi-dashboard.d.ts +0 -63
  96. package/dist-client/pages/kpi-dashboard/kpi-dashboard.js +0 -1097
  97. package/dist-client/pages/kpi-dashboard/kpi-dashboard.js.map +0 -1
  98. package/dist-client/pages/kpi-dashboard/kpi-grade-visualization.d.ts +0 -12
  99. package/dist-client/pages/kpi-dashboard/kpi-grade-visualization.js +0 -82
  100. package/dist-client/pages/kpi-dashboard/kpi-grade-visualization.js.map +0 -1
  101. package/dist-client/pages/kpi-dashboard/kpi-history-viewer.d.ts +0 -11
  102. package/dist-client/pages/kpi-dashboard/kpi-history-viewer.js +0 -65
  103. package/dist-client/pages/kpi-dashboard/kpi-history-viewer.js.map +0 -1
  104. package/dist-client/pages/kpi-dashboard/kpi-list-summary.d.ts +0 -13
  105. package/dist-client/pages/kpi-dashboard/kpi-list-summary.js +0 -115
  106. package/dist-client/pages/kpi-dashboard/kpi-list-summary.js.map +0 -1
  107. package/dist-client/pages/kpi-dashboard/kpi-performance-summary.d.ts +0 -15
  108. package/dist-client/pages/kpi-dashboard/kpi-performance-summary.js +0 -147
  109. package/dist-client/pages/kpi-dashboard/kpi-performance-summary.js.map +0 -1
  110. package/dist-client/pages/kpi-dashboard/kpi-value-entry.d.ts +0 -7
  111. package/dist-client/pages/kpi-dashboard/kpi-value-entry.js +0 -86
  112. package/dist-client/pages/kpi-dashboard/kpi-value-entry.js.map +0 -1
  113. package/dist-client/pages/kpi-metric-value/kpi-metric-value-editor-page.d.ts +0 -57
  114. package/dist-client/pages/kpi-metric-value/kpi-metric-value-editor-page.js +0 -719
  115. package/dist-client/pages/kpi-metric-value/kpi-metric-value-editor-page.js.map +0 -1
  116. package/dist-client/pages/kpi-metric-value/kpi-metric-value-importer.d.ts +0 -23
  117. package/dist-client/pages/kpi-metric-value/kpi-metric-value-importer.js +0 -76
  118. package/dist-client/pages/kpi-metric-value/kpi-metric-value-importer.js.map +0 -1
  119. package/dist-client/pages/kpi-metric-value/kpi-metric-value-list-page.d.ts +0 -68
  120. package/dist-client/pages/kpi-metric-value/kpi-metric-value-list-page.js +0 -394
  121. package/dist-client/pages/kpi-metric-value/kpi-metric-value-list-page.js.map +0 -1
  122. package/dist-client/pages/kpi-metric-value/kpi-metric-value-manual-entry-form.d.ts +0 -12
  123. package/dist-client/pages/kpi-metric-value/kpi-metric-value-manual-entry-form.js +0 -174
  124. package/dist-client/pages/kpi-metric-value/kpi-metric-value-manual-entry-form.js.map +0 -1
  125. package/dist-client/pages/kpi-metric-value/kpi-metric-value-manual-entry-page.d.ts +0 -40
  126. package/dist-client/pages/kpi-metric-value/kpi-metric-value-manual-entry-page.js +0 -190
  127. package/dist-client/pages/kpi-metric-value/kpi-metric-value-manual-entry-page.js.map +0 -1
  128. package/dist-client/pages/kpi-value/kpi-value-importer.d.ts +0 -23
  129. package/dist-client/pages/kpi-value/kpi-value-importer.js +0 -93
  130. package/dist-client/pages/kpi-value/kpi-value-importer.js.map +0 -1
  131. package/dist-client/pages/kpi-value/kpi-value-list-page.d.ts +0 -71
  132. package/dist-client/pages/kpi-value/kpi-value-list-page.js +0 -454
  133. package/dist-client/pages/kpi-value/kpi-value-list-page.js.map +0 -1
  134. package/dist-client/pages/project-complete-tabs/pc-tab1-plan.d.ts +0 -69
  135. package/dist-client/pages/project-complete-tabs/pc-tab1-plan.js +0 -790
  136. package/dist-client/pages/project-complete-tabs/pc-tab1-plan.js.map +0 -1
  137. package/dist-client/pages/project-complete-tabs/pc-tab2-rating.d.ts +0 -22
  138. package/dist-client/pages/project-complete-tabs/pc-tab2-rating.js +0 -344
  139. package/dist-client/pages/project-complete-tabs/pc-tab2-rating.js.map +0 -1
  140. package/dist-client/pages/project-complete-tabs/pc-tab3-upload.d.ts +0 -21
  141. package/dist-client/pages/project-complete-tabs/pc-tab3-upload.js +0 -335
  142. package/dist-client/pages/project-complete-tabs/pc-tab3-upload.js.map +0 -1
  143. package/dist-client/pages/project-complete-tabs/pc-tab4-monthly.d.ts +0 -51
  144. package/dist-client/pages/project-complete-tabs/pc-tab4-monthly.js +0 -674
  145. package/dist-client/pages/project-complete-tabs/pc-tab4-monthly.js.map +0 -1
  146. package/dist-client/pages/sv-project-complete.d.ts +0 -31
  147. package/dist-client/pages/sv-project-complete.js +0 -359
  148. package/dist-client/pages/sv-project-complete.js.map +0 -1
  149. package/dist-client/pages/sv-project-completed-list.d.ts +0 -27
  150. package/dist-client/pages/sv-project-completed-list.js +0 -416
  151. package/dist-client/pages/sv-project-completed-list.js.map +0 -1
  152. package/dist-client/pages/sv-project-detail.d.ts +0 -73
  153. package/dist-client/pages/sv-project-detail.js +0 -1501
  154. package/dist-client/pages/sv-project-detail.js.map +0 -1
  155. package/dist-client/pages/sv-project-list.d.ts +0 -175
  156. package/dist-client/pages/sv-project-list.js +0 -581
  157. package/dist-client/pages/sv-project-list.js.map +0 -1
  158. package/dist-client/pages/sv-project-update.d.ts +0 -91
  159. package/dist-client/pages/sv-project-update.js +0 -1150
  160. package/dist-client/pages/sv-project-update.js.map +0 -1
  161. package/dist-client/pages/sv-user-management.d.ts +0 -6
  162. package/dist-client/pages/sv-user-management.js +0 -224
  163. package/dist-client/pages/sv-user-management.js.map +0 -1
  164. package/dist-client/route.d.ts +0 -1
  165. package/dist-client/route.js +0 -58
  166. package/dist-client/route.js.map +0 -1
  167. package/dist-client/shared/complete-api.d.ts +0 -45
  168. package/dist-client/shared/complete-api.js +0 -272
  169. package/dist-client/shared/complete-api.js.map +0 -1
  170. package/dist-client/shared/func.d.ts +0 -2
  171. package/dist-client/shared/func.js +0 -22
  172. package/dist-client/shared/func.js.map +0 -1
  173. package/dist-client/shared/geo-group-mapping.d.ts +0 -25
  174. package/dist-client/shared/geo-group-mapping.js +0 -189
  175. package/dist-client/shared/geo-group-mapping.js.map +0 -1
  176. package/dist-client/shared/integration-fetch.d.ts +0 -35
  177. package/dist-client/shared/integration-fetch.js +0 -53
  178. package/dist-client/shared/integration-fetch.js.map +0 -1
  179. package/dist-client/shared/kpi-project-sync.d.ts +0 -16
  180. package/dist-client/shared/kpi-project-sync.js +0 -129
  181. package/dist-client/shared/kpi-project-sync.js.map +0 -1
  182. package/dist-client/themes/dark.css +0 -51
  183. package/dist-client/themes/light.css +0 -51
  184. package/dist-client/tsconfig.tsbuildinfo +0 -1
  185. package/dist-client/viewparts/menu-tools.d.ts +0 -62
  186. package/dist-client/viewparts/menu-tools.js +0 -554
  187. package/dist-client/viewparts/menu-tools.js.map +0 -1
  188. package/dist-client/viewparts/user-circle.d.ts +0 -5
  189. package/dist-client/viewparts/user-circle.js +0 -26
  190. package/dist-client/viewparts/user-circle.js.map +0 -1
  191. package/dist-server/index.d.ts +0 -2
  192. package/dist-server/index.js +0 -6
  193. package/dist-server/index.js.map +0 -1
  194. package/dist-server/migrations/index.d.ts +0 -1
  195. package/dist-server/migrations/index.js +0 -12
  196. package/dist-server/migrations/index.js.map +0 -1
  197. package/dist-server/scripts/calculate-kpi-scores.d.ts +0 -10
  198. package/dist-server/scripts/calculate-kpi-scores.js +0 -333
  199. package/dist-server/scripts/calculate-kpi-scores.js.map +0 -1
  200. package/dist-server/scripts/load-grade-data-migration.d.ts +0 -14
  201. package/dist-server/scripts/load-grade-data-migration.js +0 -279
  202. package/dist-server/scripts/load-grade-data-migration.js.map +0 -1
  203. package/dist-server/scripts/propagate-parent-kpi-values.d.ts +0 -14
  204. package/dist-server/scripts/propagate-parent-kpi-values.js +0 -786
  205. package/dist-server/scripts/propagate-parent-kpi-values.js.map +0 -1
  206. package/dist-server/scripts/recalculate-by-project-name.d.ts +0 -2
  207. package/dist-server/scripts/recalculate-by-project-name.js +0 -72
  208. package/dist-server/scripts/recalculate-by-project-name.js.map +0 -1
  209. package/dist-server/service/index.d.ts +0 -4
  210. package/dist-server/service/index.js +0 -20
  211. package/dist-server/service/index.js.map +0 -1
  212. package/dist-server/service/kpi-metric-value/index.d.ts +0 -4
  213. package/dist-server/service/kpi-metric-value/index.js +0 -8
  214. package/dist-server/service/kpi-metric-value/index.js.map +0 -1
  215. package/dist-server/service/kpi-metric-value/kpi-metric-value-mutation.d.ts +0 -171
  216. package/dist-server/service/kpi-metric-value/kpi-metric-value-mutation.js +0 -993
  217. package/dist-server/service/kpi-metric-value/kpi-metric-value-mutation.js.map +0 -1
  218. package/dist-server/service/kpi-metric-value/kpi-metric-value-query.d.ts +0 -12
  219. package/dist-server/service/kpi-metric-value/kpi-metric-value-query.js +0 -56
  220. package/dist-server/service/kpi-metric-value/kpi-metric-value-query.js.map +0 -1
  221. package/dist-server/service/kpi-stat/index.d.ts +0 -4
  222. package/dist-server/service/kpi-stat/index.js +0 -8
  223. package/dist-server/service/kpi-stat/index.js.map +0 -1
  224. package/dist-server/service/kpi-stat/kpi-stat-query.d.ts +0 -13
  225. package/dist-server/service/kpi-stat/kpi-stat-query.js +0 -751
  226. package/dist-server/service/kpi-stat/kpi-stat-query.js.map +0 -1
  227. package/dist-server/service/kpi-stat/kpi-stat-types.d.ts +0 -32
  228. package/dist-server/service/kpi-stat/kpi-stat-types.js +0 -180
  229. package/dist-server/service/kpi-stat/kpi-stat-types.js.map +0 -1
  230. package/dist-server/service/kpi-value/index.d.ts +0 -3
  231. package/dist-server/service/kpi-value/index.js +0 -7
  232. package/dist-server/service/kpi-value/index.js.map +0 -1
  233. package/dist-server/service/kpi-value/kpi-value-query.d.ts +0 -8
  234. package/dist-server/service/kpi-value/kpi-value-query.js +0 -90
  235. package/dist-server/service/kpi-value/kpi-value-query.js.map +0 -1
  236. package/dist-server/tsconfig.tsbuildinfo +0 -1
@@ -1,866 +0,0 @@
1
- var KpiDashboardMapPage_1;
2
- import { __decorate, __metadata } from "tslib";
3
- import gql from 'graphql-tag';
4
- import { html, css, nothing } from 'lit';
5
- import { customElement, state } from 'lit/decorators.js';
6
- import { PageView } from '@operato/shell';
7
- import { ScrollbarStyles } from '@operato/styles';
8
- import { client } from '@operato/graphql';
9
- import { notify } from '@operato/layout';
10
- import './components/kpi-map-panel';
11
- import './components/kpi-left-panel';
12
- import './components/kpi-region-popup';
13
- let KpiDashboardMapPage = KpiDashboardMapPage_1 = class KpiDashboardMapPage extends PageView {
14
- constructor() {
15
- super(...arguments);
16
- this.selectedCategory = '전체 KPI';
17
- this.selectedPeriod = '월';
18
- this.startYearMonth = ''; // YYYY-MM 형식
19
- this.endYearMonth = ''; // YYYY-MM 형식
20
- this.selectedSectorType = ''; // PUBLIC | PRIVATE
21
- this.selectedBuildingUsage = ''; // RESIDENTIAL | NON_RESIDENTIAL
22
- this.currentZoom = 7.2;
23
- this.sigunguData = []; // 시군구 단위 데이터
24
- this.nationalData = null;
25
- this.seoulData = null;
26
- this.mapData = null;
27
- this.monthlyTrendData = []; // 월별 추이 데이터
28
- this.totalKpiYStats = []; // 전체 Y-level KPI 통계
29
- this.regionalKpiStats = []; // 지역별 KPI 통계
30
- // 팝업 관련 상태 추가
31
- this.selectedRegion = null;
32
- this.selectedGeoGroup = null; // 시군구 geo_group 코드
33
- this.showRegionPopup = false;
34
- }
35
- connectedCallback() {
36
- super.connectedCallback();
37
- this.initializeDefaultPeriod();
38
- this.fetchDashboardData();
39
- this.setupKeyboardEvents();
40
- }
41
- initializeDefaultPeriod() {
42
- const now = new Date();
43
- const currentYear = now.getFullYear();
44
- const currentMonth = now.getMonth() + 1; // 0-based이므로 +1
45
- // 12개월 전 계산
46
- const startDate = new Date(now);
47
- startDate.setMonth(startDate.getMonth() - 11); // 현재 월 포함 12개월
48
- const startYear = startDate.getFullYear();
49
- const startMonth = startDate.getMonth() + 1;
50
- this.startYearMonth = `${startYear}-${startMonth.toString().padStart(2, '0')}`;
51
- this.endYearMonth = `${currentYear}-${currentMonth.toString().padStart(2, '0')}`;
52
- }
53
- setupKeyboardEvents() {
54
- document.addEventListener('keydown', e => {
55
- if (e.key === 'Escape' && this.showRegionPopup) {
56
- this.closeRegionPopup();
57
- }
58
- });
59
- }
60
- async fetchDashboardData() {
61
- try {
62
- // 새로운 KpiStatistic 구조 사용 - 지역별 집계된 통계 데이터 조회
63
- const currentMonth = new Date().toISOString().substring(0, 7); // YYYY-MM
64
- const statisticsResponse = await client.query({
65
- query: gql `
66
- query GetDashboardStatistics($valueDate: String!) {
67
- regionalKpiStatistics(periodType: MONTH, valueDate: $valueDate) {
68
- id
69
- mean
70
- median
71
- count
72
- minimum
73
- maximum
74
- standardDeviation
75
- kpi {
76
- id
77
- name
78
- description
79
- }
80
- kpiOrgScope {
81
- id
82
- scope02
83
- entityName
84
- org
85
- }
86
- }
87
- }
88
- `,
89
- variables: { valueDate: currentMonth }
90
- });
91
- this.nationalData = statisticsResponse.data.regionalKpiStatistics || [];
92
- // 통계 데이터로부터 지도 데이터 생성
93
- this.generateMapDataFromStatistics();
94
- }
95
- catch (e) {
96
- // KpiStatistic이 없는 경우 기존 방식으로 폴백
97
- await this.fetchDashboardDataFallback();
98
- }
99
- }
100
- // 폴백: KpiValue를 직접 집계하는 기존 방식
101
- async fetchDashboardDataFallback() {
102
- try {
103
- const kpiResponse = await client.query({
104
- query: gql `
105
- query {
106
- kpisLevel1 {
107
- id
108
- name
109
- description
110
- isLeaf
111
- children {
112
- id
113
- name
114
- isLeaf
115
- value {
116
- id
117
- value
118
- score
119
- valueDate
120
- kpiOrgScope {
121
- id
122
- entityName
123
- org
124
- scope01
125
- scope02
126
- }
127
- }
128
- }
129
- value {
130
- id
131
- value
132
- score
133
- valueDate
134
- kpiOrgScope {
135
- id
136
- entityName
137
- org
138
- scope01
139
- scope02
140
- }
141
- }
142
- }
143
- }
144
- `
145
- });
146
- this.nationalData = kpiResponse.data.kpisLevel1 || [];
147
- this.generateMapDataFromKpiValues();
148
- }
149
- catch (e) {
150
- notify({
151
- level: 'error',
152
- message: '대시보드 데이터를 불러오지 못했습니다.'
153
- });
154
- }
155
- }
156
- generateMapDataFromKpiValues() {
157
- // 실제 KPI 데이터로부터 지도 데이터 생성
158
- const regionCoordinates = {
159
- 서울: { lat: 37.5665, lng: 126.978 },
160
- 부산: { lat: 35.1796, lng: 129.0756 },
161
- 대구: { lat: 35.8714, lng: 128.6014 },
162
- 인천: { lat: 37.4563, lng: 126.7052 },
163
- 광주: { lat: 35.1595, lng: 126.8526 },
164
- 대전: { lat: 36.3504, lng: 127.3845 },
165
- 울산: { lat: 35.5384, lng: 129.3114 },
166
- 세종: { lat: 36.4875, lng: 127.2816 },
167
- 경기: { lat: 37.4138, lng: 127.5183 },
168
- 강원: { lat: 37.8228, lng: 128.1555 },
169
- 충북: { lat: 36.8, lng: 127.7 },
170
- 충남: { lat: 36.5184, lng: 126.8 },
171
- 전북: { lat: 35.7175, lng: 127.153 },
172
- 전남: { lat: 34.8679, lng: 126.991 },
173
- 경북: { lat: 36.4919, lng: 128.8889 },
174
- 경남: { lat: 35.4606, lng: 128.2132 },
175
- 제주: { lat: 33.4996, lng: 126.5312 }
176
- };
177
- const mapDataMap = new Map();
178
- // nationalData에서 KPI 값들을 지역별로 집계
179
- this.nationalData.forEach((kpi) => {
180
- // KPI 자체에 값이 있는 경우 (leaf KPI)
181
- if (kpi.value && kpi.value.kpiOrgScope) {
182
- const region = kpi.value.kpiOrgScope.scope02; // 시도는 scope02에 저장
183
- if (region && regionCoordinates[region]) {
184
- if (!mapDataMap.has(region)) {
185
- mapDataMap.set(region, Object.assign({ region, values: [], scores: [] }, regionCoordinates[region]));
186
- }
187
- mapDataMap.get(region).values.push(kpi.value.value);
188
- mapDataMap.get(region).scores.push(kpi.value.score);
189
- }
190
- }
191
- // 하위 KPI들의 값들도 처리
192
- if (kpi.children) {
193
- kpi.children.forEach((child) => {
194
- if (child.value && child.value.kpiOrgScope) {
195
- const region = child.value.kpiOrgScope.scope02; // 시도는 scope02에 저장
196
- if (region && regionCoordinates[region]) {
197
- if (!mapDataMap.has(region)) {
198
- mapDataMap.set(region, Object.assign({ region, values: [], scores: [] }, regionCoordinates[region]));
199
- }
200
- mapDataMap.get(region).values.push(child.value.value);
201
- mapDataMap.get(region).scores.push(child.value.score);
202
- }
203
- }
204
- });
205
- }
206
- });
207
- // 지역별 평균 계산 및 최종 지도 데이터 생성
208
- this.mapData = Array.from(mapDataMap.values()).map(regionData => {
209
- const avgValue = regionData.values.length > 0
210
- ? regionData.values.reduce((sum, val) => sum + val, 0) / regionData.values.length
211
- : 0;
212
- const avgScore = regionData.scores.length > 0
213
- ? regionData.scores.reduce((sum, val) => sum + val, 0) / regionData.scores.length
214
- : 0;
215
- // 간단한 변화율 계산 (실제로는 이전 기간과 비교해야 함)
216
- const change = (Math.random() - 0.5) * 0.4; // 임시로 -0.2 ~ 0.2 범위
217
- const trend = change >= 0 ? 'up' : 'down';
218
- return {
219
- region: regionData.region,
220
- kpi: parseFloat(avgValue.toFixed(1)),
221
- score: parseFloat(avgScore.toFixed(3)),
222
- change: parseFloat(change.toFixed(2)),
223
- trend,
224
- lat: regionData.lat,
225
- lng: regionData.lng,
226
- dataCount: regionData.values.length
227
- };
228
- });
229
- // 데이터가 없는 지역들도 기본값으로 추가
230
- Object.keys(regionCoordinates).forEach(region => {
231
- if (!mapDataMap.has(region)) {
232
- this.mapData.push({
233
- region,
234
- kpi: 0,
235
- score: 0,
236
- change: 0,
237
- trend: 'neutral',
238
- lat: regionCoordinates[region].lat,
239
- lng: regionCoordinates[region].lng,
240
- dataCount: 0
241
- });
242
- }
243
- });
244
- }
245
- generateMapDataFromStatistics() {
246
- // KpiStatistic 데이터로부터 지도 데이터 생성 (최적화된 버전)
247
- const regionCoordinates = {
248
- 서울: { lat: 37.5665, lng: 126.978 },
249
- 부산: { lat: 35.1796, lng: 129.0756 },
250
- 대구: { lat: 35.8714, lng: 128.6014 },
251
- 인천: { lat: 37.4563, lng: 126.7052 },
252
- 광주: { lat: 35.1595, lng: 126.8526 },
253
- 대전: { lat: 36.3504, lng: 127.3845 },
254
- 울산: { lat: 35.5384, lng: 129.3114 },
255
- 세종: { lat: 36.4875, lng: 127.2816 },
256
- 경기: { lat: 37.4138, lng: 127.5183 },
257
- 강원: { lat: 37.8228, lng: 128.1555 },
258
- 충북: { lat: 36.8, lng: 127.7 },
259
- 충남: { lat: 36.5184, lng: 126.8 },
260
- 전북: { lat: 35.7175, lng: 127.153 },
261
- 전남: { lat: 34.8679, lng: 126.991 },
262
- 경북: { lat: 36.4919, lng: 128.8889 },
263
- 경남: { lat: 35.4606, lng: 128.2132 },
264
- 제주: { lat: 33.4996, lng: 126.5312 }
265
- };
266
- const mapDataMap = new Map();
267
- // 통계 데이터를 지역별로 집계 (이미 서버에서 계산된 데이터 사용)
268
- this.nationalData.forEach((statistic) => {
269
- var _a;
270
- const region = (_a = statistic.kpiOrgScope) === null || _a === void 0 ? void 0 : _a.scope02;
271
- if (region && regionCoordinates[region]) {
272
- if (!mapDataMap.has(region)) {
273
- mapDataMap.set(region, Object.assign({ region, means: [], counts: [] }, regionCoordinates[region]));
274
- }
275
- // 통계값 집계 (이미 계산된 평균값들 사용)
276
- mapDataMap.get(region).means.push(statistic.mean || 0);
277
- mapDataMap.get(region).counts.push(statistic.count || 0);
278
- }
279
- });
280
- // 지역별 최종 평균 계산 및 지도 데이터 생성
281
- this.mapData = Array.from(mapDataMap.values()).map(regionData => {
282
- const avgValue = regionData.means.length > 0
283
- ? regionData.means.reduce((sum, val) => sum + val, 0) / regionData.means.length
284
- : 0;
285
- const totalCount = regionData.counts.reduce((sum, val) => sum + val, 0);
286
- // 간단한 변화율 계산 (실제로는 이전 기간과 비교해야 함)
287
- const change = (Math.random() - 0.5) * 0.4;
288
- const trend = change >= 0 ? 'up' : 'down';
289
- return {
290
- region: regionData.region,
291
- kpi: parseFloat(avgValue.toFixed(1)),
292
- change: parseFloat(change.toFixed(2)),
293
- trend,
294
- lat: regionData.lat,
295
- lng: regionData.lng,
296
- dataCount: totalCount,
297
- statisticsCount: regionData.means.length // 통계 항목 수
298
- };
299
- });
300
- // 데이터가 없는 지역들도 기본값으로 추가
301
- Object.keys(regionCoordinates).forEach(region => {
302
- if (!mapDataMap.has(region)) {
303
- this.mapData.push({
304
- region,
305
- kpi: 0,
306
- change: 0,
307
- trend: 'neutral',
308
- lat: regionCoordinates[region].lat,
309
- lng: regionCoordinates[region].lng,
310
- dataCount: 0,
311
- statisticsCount: 0
312
- });
313
- }
314
- });
315
- }
316
- generateMapDataFromRegionalStats() {
317
- // regionalKpiStats와 monthlyTrendData를 사용하여 지도 데이터 생성
318
- const regionCoordinates = {
319
- 서울특별시: { lat: 37.5665, lng: 126.978 },
320
- 부산광역시: { lat: 35.1796, lng: 129.0756 },
321
- 대구광역시: { lat: 35.8714, lng: 128.6014 },
322
- 인천광역시: { lat: 37.4563, lng: 126.7052 },
323
- 광주광역시: { lat: 35.1595, lng: 126.8526 },
324
- 대전광역시: { lat: 36.3504, lng: 127.3845 },
325
- 울산광역시: { lat: 35.5384, lng: 129.3114 },
326
- 세종특별자치시: { lat: 36.4875, lng: 127.2816 },
327
- 경기도: { lat: 37.4138, lng: 127.5183 },
328
- 강원도: { lat: 37.8228, lng: 128.1555 },
329
- 충청북도: { lat: 36.8, lng: 127.7 },
330
- 충청남도: { lat: 36.5184, lng: 126.8 },
331
- 전라북도: { lat: 35.7175, lng: 127.153 },
332
- 전라남도: { lat: 34.8679, lng: 126.991 },
333
- 경상북도: { lat: 36.4919, lng: 128.8889 },
334
- 경상남도: { lat: 35.4606, lng: 128.2132 },
335
- 제주특별자치도: { lat: 33.4996, lng: 126.5312 }
336
- };
337
- this.mapData = Object.keys(regionCoordinates).map(regionName => {
338
- const stat = this.regionalKpiStats.find(s => s.geoGroup === regionName);
339
- const changeRate = this.calculateChangeRate(regionName);
340
- return {
341
- region: regionName,
342
- kpi: stat ? (stat.avgVal * 100).toFixed(1) : '0.0',
343
- change: changeRate.toFixed(2),
344
- trend: changeRate >= 0 ? 'up' : 'down',
345
- lat: regionCoordinates[regionName].lat,
346
- lng: regionCoordinates[regionName].lng,
347
- dataCount: (stat === null || stat === void 0 ? void 0 : stat.projectCount) || 0
348
- };
349
- });
350
- }
351
- async fetchSigunguData() {
352
- try {
353
- const categoryToKpiName = {
354
- '전체 KPI': null,
355
- '일정 성과': '일정성과(Y1)',
356
- '비용 성과': '비용성과(Y2)',
357
- '품질 성과': '품질성과(Y3)',
358
- '안전 성과': 'Y4. 안전성과',
359
- '환경 성과': '환경성과(Y5)',
360
- '생산성 성과': '생산성성과(Y6)'
361
- };
362
- const kpiName = categoryToKpiName[this.selectedCategory];
363
- const response = await client.query({
364
- query: gql `
365
- query GetSigunguStats(
366
- $kpiName: String
367
- $startYearMonth: String
368
- $endYearMonth: String
369
- $sectorType: String
370
- $buildingUsage: String
371
- ) {
372
- kpiZValueStatsBySigungu(
373
- kpiName: $kpiName
374
- startYearMonth: $startYearMonth
375
- endYearMonth: $endYearMonth
376
- sectorType: $sectorType
377
- buildingUsage: $buildingUsage
378
- ) {
379
- geoGroup
380
- avgVal
381
- minVal
382
- maxVal
383
- projectCount
384
- }
385
- }
386
- `,
387
- variables: {
388
- kpiName,
389
- startYearMonth: this.startYearMonth || null,
390
- endYearMonth: this.endYearMonth || null,
391
- sectorType: this.selectedSectorType || null,
392
- buildingUsage: this.selectedBuildingUsage || null
393
- }
394
- });
395
- this.sigunguData = response.data.kpiZValueStatsBySigungu || [];
396
- this.generateSigunguMapData();
397
- }
398
- catch (e) {
399
- console.error('시군구 데이터 조회 실패:', e);
400
- }
401
- }
402
- calculateChangeRate(metroName) {
403
- const regionMonthlyData = this.monthlyTrendData
404
- .filter((d) => d.geoGroup === metroName)
405
- .sort((a, b) => a.yearMonth.localeCompare(b.yearMonth));
406
- if (regionMonthlyData.length >= 2) {
407
- const oldest = regionMonthlyData[0].avgVal;
408
- const latest = regionMonthlyData[regionMonthlyData.length - 1].avgVal;
409
- if (oldest !== 0) {
410
- return ((latest - oldest) / oldest) * 100;
411
- }
412
- }
413
- return 0;
414
- }
415
- generateSigunguMapData() {
416
- const map = KpiDashboardMapPage_1.SIGUNGU_MAP;
417
- const geoToMetro = KpiDashboardMapPage_1.GEO_TO_METRO;
418
- this.mapData = this.sigunguData
419
- .filter((s) => s.geoGroup && map[s.geoGroup])
420
- .map((s) => {
421
- const info = map[s.geoGroup];
422
- const metro = geoToMetro[s.geoGroup] || '';
423
- const changeRate = this.calculateChangeRate(metro);
424
- return {
425
- region: info.name,
426
- kpi: (s.avgVal * 100).toFixed(1),
427
- change: changeRate.toFixed(2),
428
- trend: changeRate >= 0 ? 'up' : 'down',
429
- lat: info.lat,
430
- lng: info.lng,
431
- dataCount: s.projectCount || 0
432
- };
433
- });
434
- }
435
- onZoomChanged(e) {
436
- const newZoom = e.detail.zoom;
437
- const threshold = KpiDashboardMapPage_1.SIGUNGU_ZOOM_THRESHOLD;
438
- const wasAbove = this.currentZoom >= threshold;
439
- const isAbove = newZoom >= threshold;
440
- this.currentZoom = newZoom;
441
- // 줌 레벨이 threshold를 넘나들 때만 데이터 전환
442
- if (wasAbove !== isAbove) {
443
- if (isAbove) {
444
- this.fetchSigunguData();
445
- }
446
- else {
447
- this.generateMapDataFromRegionalStats();
448
- }
449
- }
450
- }
451
- /**
452
- * 필터/기간/카테고리 변경으로 데이터가 갱신될 때 현재 줌 레벨에 맞는 지도 마커로 갱신.
453
- * 시군구 줌 상태면 시군구 데이터를 (현재 필터로) 다시 조회 — 광역으로 되돌아가지 않도록.
454
- */
455
- _refreshMapForZoom() {
456
- if (this.currentZoom >= KpiDashboardMapPage_1.SIGUNGU_ZOOM_THRESHOLD) {
457
- this.fetchSigunguData();
458
- }
459
- else {
460
- this.generateMapDataFromRegionalStats();
461
- }
462
- }
463
- focusMapOnRegion(regionName) {
464
- var _a;
465
- const bounds = KpiDashboardMapPage_1.METRO_BOUNDS[regionName];
466
- if (!bounds)
467
- return;
468
- const mapPanel = (_a = this.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector('kpi-map-panel');
469
- mapPanel === null || mapPanel === void 0 ? void 0 : mapPanel.focusOnLocation(bounds.lat, bounds.lng, bounds.zoom);
470
- }
471
- downloadExcel() { }
472
- onRegionClick(region) {
473
- this.selectedRegion = region;
474
- // 시군구 모드인 경우 region name → geo_group 코드 역매핑
475
- const sigunguMap = KpiDashboardMapPage_1.SIGUNGU_MAP;
476
- const entry = Object.entries(sigunguMap).find(([, v]) => v.name === region);
477
- this.selectedGeoGroup = entry ? entry[0] : null;
478
- this.showRegionPopup = true;
479
- // fetchRegionData는 더 이상 필요하지 않음 (kpi-region-popup에서 직접 데이터 가져옴)
480
- // this.fetchRegionData(region)
481
- }
482
- closeRegionPopup() {
483
- this.showRegionPopup = false;
484
- this.selectedRegion = null;
485
- this.selectedGeoGroup = null; // 시군구 코드도 초기화 — 다음 선택에 이전 시군구가 남지 않도록
486
- }
487
- async fetchRegionData(region) {
488
- try {
489
- const response = await client.query({
490
- query: gql `
491
- query GetRegionKpiData($filters: [Filter!]) {
492
- kpiValues: latestKpiValues(filters: $filters) {
493
- items {
494
- id
495
- value
496
- score
497
- valueDate
498
- kpiOrgScope {
499
- id
500
- org
501
- scope01
502
- scope02
503
- entityName
504
- }
505
- kpi {
506
- id
507
- name
508
- parent {
509
- id
510
- name
511
- }
512
- }
513
- }
514
- total
515
- }
516
- }
517
- `,
518
- variables: {
519
- filters: [{ name: 'kpiOrgScope.scope02', operator: 'eq', value: region }]
520
- }
521
- });
522
- this.seoulData = response.data.kpiValues.items || [];
523
- }
524
- catch (e) {
525
- notify({
526
- level: 'error',
527
- message: '지역 데이터를 불러오지 못했습니다.'
528
- });
529
- }
530
- }
531
- get context() {
532
- return {
533
- title: 'KPI Oversight',
534
- description: '전국 및 지역별 KPI 성과 분석 대시보드'
535
- };
536
- }
537
- _onSectorTypeChange(e) {
538
- this.selectedSectorType = e.target.value;
539
- }
540
- _onBuildingUsageChange(e) {
541
- this.selectedBuildingUsage = e.target.value;
542
- }
543
- render() {
544
- return html `
545
- <div class="dashboard-container">
546
- <!-- 좌측 패널: 전국 KPI -->
547
- <kpi-left-panel
548
- .selectedCategory=${this.selectedCategory}
549
- .startYearMonth=${this.startYearMonth}
550
- .endYearMonth=${this.endYearMonth}
551
- .sectorType=${this.selectedSectorType}
552
- .buildingUsage=${this.selectedBuildingUsage}
553
- .mapData=${this.mapData}
554
- @category-change=${(e) => {
555
- this.selectedCategory = e.detail.category;
556
- }}
557
- @period-change=${(e) => {
558
- // 좌측 패널 기간 변경을 부모로 동기화 → 지역 팝업도 같은 기간으로 조회 (기준 일치)
559
- this.startYearMonth = e.detail.startYearMonth;
560
- this.endYearMonth = e.detail.endYearMonth;
561
- }}
562
- @sector-change=${(e) => {
563
- // 유형 필터를 부모로 동기화 → 지역 팝업도 같은 유형 필터 사용
564
- this.selectedSectorType = e.detail.sectorType;
565
- }}
566
- @usage-change=${(e) => {
567
- // 용도 필터를 부모로 동기화 → 지역 팝업도 같은 용도 필터 사용
568
- this.selectedBuildingUsage = e.detail.buildingUsage;
569
- }}
570
- @region-click=${(e) => {
571
- this.onRegionClick(e.detail.region);
572
- }}
573
- @focus-region=${(e) => {
574
- this.focusMapOnRegion(e.detail.region);
575
- }}
576
- @monthly-trend-data-loaded=${(e) => {
577
- this.monthlyTrendData = e.detail.data;
578
- this._refreshMapForZoom();
579
- }}
580
- @total-kpi-y-stats-loaded=${(e) => {
581
- this.totalKpiYStats = e.detail.data;
582
- }}
583
- @regional-kpi-stats-loaded=${(e) => {
584
- this.regionalKpiStats = e.detail.data;
585
- this._refreshMapForZoom();
586
- }}
587
- @download-excel=${this.downloadExcel}
588
- ></kpi-left-panel>
589
-
590
- <!-- 우측 패널: 지도 -->
591
- <kpi-map-panel
592
- class="right-panel"
593
- .selectedCategory=${this.selectedCategory}
594
- .mapData=${this.mapData}
595
- .selectedRegion=${this.selectedRegion}
596
- @region-click=${(e) => {
597
- this.onRegionClick(e.detail.region);
598
- }}
599
- @zoom-changed=${(e) => {
600
- this.onZoomChanged(e);
601
- }}
602
- ></kpi-map-panel>
603
-
604
- <!-- 지역 상세 팝업 -->
605
- ${this.showRegionPopup
606
- ? html `
607
- <kpi-region-popup
608
- .selectedRegion=${this.selectedRegion}
609
- .geoGroup=${this.selectedGeoGroup}
610
- .selectedCategory=${this.selectedCategory}
611
- .monthlyTrendData=${this.monthlyTrendData}
612
- .totalKpiStats=${this.totalKpiYStats}
613
- .startYearMonth=${this.startYearMonth}
614
- .endYearMonth=${this.endYearMonth}
615
- .sectorType=${this.selectedSectorType}
616
- .buildingUsage=${this.selectedBuildingUsage}
617
- @popup-close=${this.closeRegionPopup}
618
- ></kpi-region-popup>
619
- `
620
- : nothing}
621
- </div>
622
- `;
623
- }
624
- };
625
- KpiDashboardMapPage.styles = [
626
- ScrollbarStyles,
627
- css `
628
- :host {
629
- display: flex;
630
- flex-direction: column;
631
- overflow: hidden;
632
- position: relative;
633
- }
634
-
635
- .dashboard-container {
636
- display: flex;
637
- flex: 1;
638
- overflow: hidden;
639
- }
640
-
641
- .right-panel {
642
- flex: 1;
643
- background: #f8f9fa;
644
- overflow: hidden;
645
- position: relative;
646
- }
647
- `
648
- ];
649
- KpiDashboardMapPage.SIGUNGU_ZOOM_THRESHOLD = 10;
650
- // 시군구별 좌표 (geo_group 2자리 코드 → { name, lat, lng })
651
- KpiDashboardMapPage.SIGUNGU_MAP = {
652
- '01': { name: '서울 종로구', lat: 37.5735, lng: 126.979 },
653
- '02': { name: '서울 중구', lat: 37.5641, lng: 126.9979 },
654
- '03': { name: '서울 용산구', lat: 37.5326, lng: 126.9906 },
655
- '04': { name: '서울 성동구', lat: 37.5634, lng: 127.0369 },
656
- '05': { name: '서울 광진구', lat: 37.5385, lng: 127.0823 },
657
- '06': { name: '서울 강남구', lat: 37.5172, lng: 127.0473 },
658
- '07': { name: '서울 송파구', lat: 37.5145, lng: 127.106 },
659
- '08': { name: '서울 강서구', lat: 37.551, lng: 126.8495 },
660
- '10': { name: '수원시', lat: 37.2636, lng: 127.0286 },
661
- '11': { name: '성남시', lat: 37.42, lng: 127.1265 },
662
- '12': { name: '고양시', lat: 37.6584, lng: 126.832 },
663
- '13': { name: '용인시', lat: 37.2411, lng: 127.1776 },
664
- '14': { name: '부천시', lat: 37.5034, lng: 126.766 },
665
- '15': { name: '안산시', lat: 37.3219, lng: 126.8309 },
666
- '16': { name: '화성시', lat: 37.1995, lng: 126.8312 },
667
- '17': { name: '평택시', lat: 36.9921, lng: 127.1127 },
668
- '18': { name: '파주시', lat: 37.7599, lng: 126.7799 },
669
- '21': { name: '인천 남동구', lat: 37.4488, lng: 126.7308 },
670
- '22': { name: '인천 부평구', lat: 37.5076, lng: 126.7218 },
671
- '23': { name: '인천 서구', lat: 37.5458, lng: 126.676 },
672
- '24': { name: '춘천시', lat: 37.8813, lng: 127.73 },
673
- '25': { name: '원주시', lat: 37.3422, lng: 127.9202 },
674
- '26': { name: '강릉시', lat: 37.7519, lng: 128.8761 },
675
- '27': { name: '청주시', lat: 36.6424, lng: 127.489 },
676
- '28': { name: '충주시', lat: 36.991, lng: 127.9259 },
677
- '29': { name: '제천시', lat: 37.1327, lng: 128.191 },
678
- '30': { name: '세종시', lat: 36.4875, lng: 127.2816 },
679
- '31': { name: '천안시', lat: 36.8151, lng: 127.1139 },
680
- '32': { name: '아산시', lat: 36.7898, lng: 127.0018 },
681
- '33': { name: '속초시', lat: 38.2071, lng: 128.5918 },
682
- '34': { name: '대전 서구', lat: 36.3555, lng: 127.3835 },
683
- '35': { name: '대전 유성구', lat: 36.3622, lng: 127.3561 },
684
- '36': { name: '포항시', lat: 36.019, lng: 129.3435 },
685
- '37': { name: '경주시', lat: 35.8562, lng: 129.2247 },
686
- '38': { name: '구미시', lat: 36.1196, lng: 128.3443 },
687
- '39': { name: '안동시', lat: 36.5684, lng: 128.7294 },
688
- '40': { name: '김천시', lat: 36.1398, lng: 128.1136 },
689
- '41': { name: '대구 중구', lat: 35.8693, lng: 128.6062 },
690
- '42': { name: '대구 수성구', lat: 35.8584, lng: 128.6308 },
691
- '43': { name: '대구 달서구', lat: 35.8299, lng: 128.5327 },
692
- '44': { name: '울산 남구', lat: 35.5444, lng: 129.3304 },
693
- '45': { name: '울산 중구', lat: 35.5696, lng: 129.3324 },
694
- '46': { name: '부산 중구', lat: 35.106, lng: 129.0324 },
695
- '47': { name: '부산 해운대구', lat: 35.1631, lng: 129.1636 },
696
- '48': { name: '부산 사하구', lat: 35.1046, lng: 128.9751 },
697
- '49': { name: '부산 금정구', lat: 35.2431, lng: 129.0923 },
698
- '50': { name: '창원시', lat: 35.2281, lng: 128.6812 },
699
- '51': { name: '김해시', lat: 35.2285, lng: 128.8894 },
700
- '52': { name: '진주시', lat: 35.1798, lng: 128.1076 },
701
- '53': { name: '양산시', lat: 35.335, lng: 129.0373 },
702
- '54': { name: '전주시', lat: 35.8242, lng: 127.148 },
703
- '55': { name: '익산시', lat: 35.9483, lng: 126.9576 },
704
- '56': { name: '군산시', lat: 35.9676, lng: 126.7369 },
705
- '57': { name: '목포시', lat: 34.8118, lng: 126.3922 },
706
- '58': { name: '여수시', lat: 34.7604, lng: 127.6622 },
707
- '59': { name: '순천시', lat: 34.9506, lng: 127.4873 },
708
- '61': { name: '광주 서구', lat: 35.1525, lng: 126.8895 },
709
- '62': { name: '광주 북구', lat: 35.1744, lng: 126.912 },
710
- '63': { name: '제주시', lat: 33.4996, lng: 126.5312 }
711
- };
712
- // geo_group 코드 → 광역시도 매핑
713
- KpiDashboardMapPage.GEO_TO_METRO = {
714
- '01': '서울특별시',
715
- '02': '서울특별시',
716
- '03': '서울특별시',
717
- '04': '서울특별시',
718
- '05': '서울특별시',
719
- '06': '서울특별시',
720
- '07': '서울특별시',
721
- '08': '서울특별시',
722
- '10': '경기도',
723
- '11': '경기도',
724
- '12': '경기도',
725
- '13': '경기도',
726
- '14': '경기도',
727
- '15': '경기도',
728
- '16': '경기도',
729
- '17': '경기도',
730
- '18': '경기도',
731
- '21': '인천광역시',
732
- '22': '인천광역시',
733
- '23': '인천광역시',
734
- '24': '강원도',
735
- '25': '강원도',
736
- '26': '강원도',
737
- '33': '강원도',
738
- '27': '충청북도',
739
- '28': '충청북도',
740
- '29': '충청북도',
741
- '30': '세종특별자치시',
742
- '31': '충청남도',
743
- '32': '충청남도',
744
- '34': '대전광역시',
745
- '35': '대전광역시',
746
- '36': '경상북도',
747
- '37': '경상북도',
748
- '38': '경상북도',
749
- '39': '경상북도',
750
- '40': '경상북도',
751
- '41': '대구광역시',
752
- '42': '대구광역시',
753
- '43': '대구광역시',
754
- '44': '울산광역시',
755
- '45': '울산광역시',
756
- '46': '부산광역시',
757
- '47': '부산광역시',
758
- '48': '부산광역시',
759
- '49': '부산광역시',
760
- '50': '경상남도',
761
- '51': '경상남도',
762
- '52': '경상남도',
763
- '53': '경상남도',
764
- '54': '전라북도',
765
- '55': '전라북도',
766
- '56': '전라북도',
767
- '57': '전라남도',
768
- '58': '전라남도',
769
- '59': '전라남도',
770
- '61': '광주광역시',
771
- '62': '광주광역시',
772
- '63': '제주특별자치도'
773
- };
774
- // 광역시도별 중심 좌표 + 줌 레벨 (시군구가 모두 보이는 수준)
775
- KpiDashboardMapPage.METRO_BOUNDS = {
776
- 서울특별시: { lat: 37.5665, lng: 126.978, zoom: 11 },
777
- 부산광역시: { lat: 35.1796, lng: 129.0756, zoom: 11 },
778
- 대구광역시: { lat: 35.8714, lng: 128.6014, zoom: 11 },
779
- 인천광역시: { lat: 37.4563, lng: 126.7052, zoom: 11 },
780
- 광주광역시: { lat: 35.1595, lng: 126.8526, zoom: 12 },
781
- 대전광역시: { lat: 36.3504, lng: 127.3845, zoom: 12 },
782
- 울산광역시: { lat: 35.5384, lng: 129.3114, zoom: 11 },
783
- 세종특별자치시: { lat: 36.4875, lng: 127.2816, zoom: 12 },
784
- 경기도: { lat: 37.4138, lng: 127.0183, zoom: 9 },
785
- 강원도: { lat: 37.8228, lng: 128.1555, zoom: 9 },
786
- 충청북도: { lat: 36.8, lng: 127.7, zoom: 9 },
787
- 충청남도: { lat: 36.5184, lng: 126.8, zoom: 10 },
788
- 전라북도: { lat: 35.7175, lng: 127.153, zoom: 10 },
789
- 전라남도: { lat: 34.8679, lng: 126.991, zoom: 9 },
790
- 경상북도: { lat: 36.4919, lng: 128.8889, zoom: 9 },
791
- 경상남도: { lat: 35.4606, lng: 128.2132, zoom: 9 },
792
- 제주특별자치도: { lat: 33.4996, lng: 126.5312, zoom: 11 }
793
- };
794
- __decorate([
795
- state(),
796
- __metadata("design:type", Object)
797
- ], KpiDashboardMapPage.prototype, "selectedCategory", void 0);
798
- __decorate([
799
- state(),
800
- __metadata("design:type", Object)
801
- ], KpiDashboardMapPage.prototype, "selectedPeriod", void 0);
802
- __decorate([
803
- state(),
804
- __metadata("design:type", Object)
805
- ], KpiDashboardMapPage.prototype, "startYearMonth", void 0);
806
- __decorate([
807
- state(),
808
- __metadata("design:type", Object)
809
- ], KpiDashboardMapPage.prototype, "endYearMonth", void 0);
810
- __decorate([
811
- state(),
812
- __metadata("design:type", Object)
813
- ], KpiDashboardMapPage.prototype, "selectedSectorType", void 0);
814
- __decorate([
815
- state(),
816
- __metadata("design:type", Object)
817
- ], KpiDashboardMapPage.prototype, "selectedBuildingUsage", void 0);
818
- __decorate([
819
- state(),
820
- __metadata("design:type", Object)
821
- ], KpiDashboardMapPage.prototype, "currentZoom", void 0);
822
- __decorate([
823
- state(),
824
- __metadata("design:type", Array)
825
- ], KpiDashboardMapPage.prototype, "sigunguData", void 0);
826
- __decorate([
827
- state(),
828
- __metadata("design:type", Object)
829
- ], KpiDashboardMapPage.prototype, "nationalData", void 0);
830
- __decorate([
831
- state(),
832
- __metadata("design:type", Object)
833
- ], KpiDashboardMapPage.prototype, "seoulData", void 0);
834
- __decorate([
835
- state(),
836
- __metadata("design:type", Object)
837
- ], KpiDashboardMapPage.prototype, "mapData", void 0);
838
- __decorate([
839
- state(),
840
- __metadata("design:type", Array)
841
- ], KpiDashboardMapPage.prototype, "monthlyTrendData", void 0);
842
- __decorate([
843
- state(),
844
- __metadata("design:type", Array)
845
- ], KpiDashboardMapPage.prototype, "totalKpiYStats", void 0);
846
- __decorate([
847
- state(),
848
- __metadata("design:type", Array)
849
- ], KpiDashboardMapPage.prototype, "regionalKpiStats", void 0);
850
- __decorate([
851
- state(),
852
- __metadata("design:type", Object)
853
- ], KpiDashboardMapPage.prototype, "selectedRegion", void 0);
854
- __decorate([
855
- state(),
856
- __metadata("design:type", Object)
857
- ], KpiDashboardMapPage.prototype, "selectedGeoGroup", void 0);
858
- __decorate([
859
- state(),
860
- __metadata("design:type", Object)
861
- ], KpiDashboardMapPage.prototype, "showRegionPopup", void 0);
862
- KpiDashboardMapPage = KpiDashboardMapPage_1 = __decorate([
863
- customElement('kpi-dashboard-map')
864
- ], KpiDashboardMapPage);
865
- export { KpiDashboardMapPage };
866
- //# sourceMappingURL=kpi-dashboard-map.js.map