@dssp/dkpi 1.0.0-alpha.87 → 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.
- package/_index.html +4 -4
- package/assets/helps/index.md +1 -1
- package/assets/manifest.json +2 -2
- package/dist-client/components/kpi-boxplot-chart.d.ts +7 -0
- package/dist-client/components/kpi-boxplot-chart.js +20 -5
- package/dist-client/components/kpi-boxplot-chart.js.map +1 -1
- package/dist-client/components/kpi-lookup-chart.js +1 -17
- package/dist-client/components/kpi-lookup-chart.js.map +1 -1
- package/dist-client/components/kpi-radar-chart.js +2 -2
- package/dist-client/components/kpi-radar-chart.js.map +1 -1
- package/dist-client/components/kpi-single-boxplot-chart.d.ts +7 -0
- package/dist-client/components/kpi-single-boxplot-chart.js +27 -26
- package/dist-client/components/kpi-single-boxplot-chart.js.map +1 -1
- package/dist-client/components/kpi-step-lookup-chart.d.ts +33 -0
- package/dist-client/components/kpi-step-lookup-chart.js +181 -0
- package/dist-client/components/kpi-step-lookup-chart.js.map +1 -0
- package/dist-client/components/kpi-trend-chart.js +2 -12
- package/dist-client/components/kpi-trend-chart.js.map +1 -1
- package/dist-client/google-map/common-google-map.js +5 -1
- package/dist-client/google-map/common-google-map.js.map +1 -1
- package/dist-client/pages/kpi-admin/dssp-kpi-overview.d.ts +2 -1
- package/dist-client/pages/kpi-admin/dssp-kpi-overview.js +24 -9
- package/dist-client/pages/kpi-admin/dssp-kpi-overview.js.map +1 -1
- package/dist-client/pages/kpi-admin/kpi-system-guide.js +311 -158
- package/dist-client/pages/kpi-admin/kpi-system-guide.js.map +1 -1
- package/dist-client/pages/kpi-dashboard/components/kpi-left-panel.d.ts +6 -0
- package/dist-client/pages/kpi-dashboard/components/kpi-left-panel.js +110 -50
- package/dist-client/pages/kpi-dashboard/components/kpi-left-panel.js.map +1 -1
- package/dist-client/pages/kpi-dashboard/components/kpi-map-panel.d.ts +0 -9
- package/dist-client/pages/kpi-dashboard/components/kpi-map-panel.js +6 -91
- package/dist-client/pages/kpi-dashboard/components/kpi-map-panel.js.map +1 -1
- package/dist-client/pages/kpi-dashboard/components/kpi-region-popup.d.ts +2 -0
- package/dist-client/pages/kpi-dashboard/components/kpi-region-popup.js +148 -68
- package/dist-client/pages/kpi-dashboard/components/kpi-region-popup.js.map +1 -1
- package/dist-client/pages/kpi-dashboard/kpi-dashboard-map.js +85 -41
- package/dist-client/pages/kpi-dashboard/kpi-dashboard-map.js.map +1 -1
- package/dist-client/pages/kpi-dashboard/kpi-dashboard.js +15 -7
- package/dist-client/pages/kpi-dashboard/kpi-dashboard.js.map +1 -1
- package/dist-client/pages/project-complete-tabs/pc-tab1-plan.js +16 -25
- package/dist-client/pages/project-complete-tabs/pc-tab1-plan.js.map +1 -1
- package/dist-client/pages/project-complete-tabs/pc-tab2-rating.js +9 -13
- package/dist-client/pages/project-complete-tabs/pc-tab2-rating.js.map +1 -1
- package/dist-client/pages/project-complete-tabs/pc-tab4-monthly.js +9 -15
- package/dist-client/pages/project-complete-tabs/pc-tab4-monthly.js.map +1 -1
- package/dist-client/pages/sv-project-complete.js +7 -11
- package/dist-client/pages/sv-project-complete.js.map +1 -1
- package/dist-client/pages/sv-project-completed-list.js +4 -4
- package/dist-client/pages/sv-project-completed-list.js.map +1 -1
- package/dist-client/pages/sv-project-detail.d.ts +1 -0
- package/dist-client/pages/sv-project-detail.js +65 -51
- package/dist-client/pages/sv-project-detail.js.map +1 -1
- package/dist-client/pages/sv-project-list.js +15 -12
- package/dist-client/pages/sv-project-list.js.map +1 -1
- package/dist-client/tsconfig.tsbuildinfo +1 -1
- package/dist-client/viewparts/menu-tools.js +17 -3
- package/dist-client/viewparts/menu-tools.js.map +1 -1
- package/dist-server/service/kpi-stat/kpi-stat-query.js +20 -19
- package/dist-server/service/kpi-stat/kpi-stat-query.js.map +1 -1
- package/dist-server/tsconfig.tsbuildinfo +1 -1
- package/openapi/unstable.yaml +2 -2
- package/package.json +3 -3
- package/schema.graphql +20 -0
- package/translations/ko.json +2 -2
- package/views/auth-page.html +4 -4
- package/views/public/home.html +5 -5
|
@@ -45,7 +45,18 @@ let MenuTools = class MenuTools extends connect(store)(LitElement) {
|
|
|
45
45
|
this.openedMenuIndex = null;
|
|
46
46
|
this.openedSubmenuIndex = null;
|
|
47
47
|
this.submenuHeight = null;
|
|
48
|
-
this._closeSubmenu = () => {
|
|
48
|
+
this._closeSubmenu = (e) => {
|
|
49
|
+
const path = e.composedPath();
|
|
50
|
+
// 메뉴 영역 내부 클릭(메인메뉴 선택·서브서브메뉴 토글)은 닫지 않는다.
|
|
51
|
+
// capture 단계라 내부 핸들러보다 먼저 발화하므로 composedPath 로 직접 판별.
|
|
52
|
+
if (path.includes(this)) {
|
|
53
|
+
// 단, 내부라도 실제 페이지로 이동하는 링크 클릭이면 기존대로 닫는다.
|
|
54
|
+
const isNavLink = path.some(el => el instanceof HTMLAnchorElement &&
|
|
55
|
+
!!el.getAttribute('href') &&
|
|
56
|
+
el.getAttribute('href') !== 'javascript:void(0)');
|
|
57
|
+
if (!isNavLink)
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
49
60
|
this.openedMenuIndex = null;
|
|
50
61
|
};
|
|
51
62
|
}
|
|
@@ -267,10 +278,13 @@ let MenuTools = class MenuTools extends connect(store)(LitElement) {
|
|
|
267
278
|
}
|
|
268
279
|
connectedCallback() {
|
|
269
280
|
super.connectedCallback();
|
|
270
|
-
|
|
281
|
+
// capture 단계로 등록 — 헤더 프로젝트 셀렉터(domain-switch)처럼 트리거에서
|
|
282
|
+
// stopPropagation 하는 다른 컴포넌트의 클릭도 놓치지 않고 감지해 서브메뉴를 닫는다.
|
|
283
|
+
// (버블 단계면 stopPropagation 에 막혀 셀렉터를 열어도 서브메뉴가 닫히지 않음)
|
|
284
|
+
window.addEventListener('click', this._closeSubmenu, true);
|
|
271
285
|
}
|
|
272
286
|
disconnectedCallback() {
|
|
273
|
-
window.removeEventListener('click', this._closeSubmenu);
|
|
287
|
+
window.removeEventListener('click', this._closeSubmenu, true);
|
|
274
288
|
super.disconnectedCallback();
|
|
275
289
|
}
|
|
276
290
|
_toggleSubsubmenu(e, subIndex) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"menu-tools.js","sourceRoot":"","sources":["../../client/viewparts/menu-tools.ts"],"names":[],"mappings":";AAAA,OAAO,4BAA4B,CAAA;AAEnC,OAAO,GAAG,MAAM,aAAa,CAAA;AAC7B,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,KAAK,CAAA;AAC3C,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAA;AAEzE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAA;AAC/C,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AAGzC,OAAO,EAAE,mBAAmB,EAAE,MAAM,iDAAiD,CAAA;AAErF,iGAAiG;AACjG,MAAM,CAAC,KAAK,UAAU,aAAa;IACjC,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC;QAClC,KAAK,EAAE,GAAG,CAAA;;;;;;;;;;;;;KAaT;QACD,SAAS,EAAE;YACT,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,QAAQ;oBACd,QAAQ,EAAE,IAAI;oBACd,KAAK,EAAE,IAAI;iBACZ;aACF;YACD,UAAU,EAAE,EAAE;YACd,QAAQ,EAAE,EAAE;SACb;KACF,CAAC,CAAA;IAEF,OAAO,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAA;AACtC,CAAC;AAGM,IAAM,SAAS,GAAf,MAAM,SAAU,SAAQ,OAAO,CAAC,KAAK,CAAC,CAAC,UAAU,CAAC;IAAlD;;QAiNI,aAAQ,GAAU,EAAE,CAAA;QACpB,UAAK,GAYR,IAAI,CAAC,QAAQ,EAAE,CAAA;QAyHO,oBAAe,GAAkB,IAAI,CAAA;QACrC,uBAAkB,GAAkB,IAAI,CAAA;QAExC,kBAAa,GAAkB,IAAI,CAAA;QA4IvD,kBAAa,GAAG,GAAG,EAAE;YAC3B,IAAI,CAAC,eAAe,GAAG,IAAI,CAAA;QAC7B,CAAC,CAAA;IA2BH,CAAC;IAnSS,QAAQ;QAad,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAA;QAC9B,MAAM,eAAe,GAAG,mBAAmB,EAAE,CAAA;QAE7C,uCAAuC;QACvC,MAAM,eAAe,GAAG;YACtB,IAAI,EAAE,GAAG;YACT,IAAI,EAAE,cAAc;YACpB,IAAI,EAAE,eAAe;YACrB,MAAM,EAAE,CAAC,EAAE,IAAI,EAAoB,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC;YAC7D,QAAQ,EAAE;gBACR,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,mBAAmB,EAAE,IAAI,EAAE,WAAW,EAAE;gBAClE,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,UAAU,EAAE;gBAC3D,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,wBAAwB,EAAE,IAAI,EAAE,aAAa,EAAE;aAC5E;SACF,CAAA;QAED,wDAAwD;QACxD,MAAM,eAAe,GAAG;YACtB,IAAI,EAAE,MAAM;YACZ,IAAI,EAAE,kBAAkB;YACxB,IAAI,EAAE,WAAW;YACjB,MAAM,EAAE,CAAC,EAAE,IAAI,EAAoB,EAAE,EAAE,CAAC,iDAAiD,CAAC,IAAI,CAAC,IAAI,CAAC;YACpG,QAAQ,EAAE;gBACR,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,gBAAgB,EAAE,IAAI,EAAE,WAAW,EAAE;gBAChE,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,gBAAgB,EAAE,IAAI,EAAE,WAAW,EAAE;gBAC9D,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,kBAAkB,EAAE,IAAI,EAAE,WAAW,EAAE;aACnE;SACF,CAAA;QAED,OAAO;YACL,eAAe,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,eAAe;YACnD;gBACE,IAAI,EAAE,KAAK;gBACX,IAAI,EAAE,cAAc;gBACpB,IAAI,EAAE,WAAW;gBACjB,QAAQ,EAAE;oBACR,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,cAAc,EAAE;oBAC9D,CAAC,CAAC,eAAe,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,iBAAiB,EAAE,CAAC,IAAI,IAAI;oBAC3F,CAAC,CAAC,eAAe,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,gBAAgB,EAAE,IAAI,EAAE,wBAAwB,EAAE,CAAC,IAAI,IAAI;oBAC1G,CAAC,CAAC,eAAe,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,iBAAiB,EAAE,IAAI,EAAE,kBAAkB,EAAE,CAAC,IAAI,IAAI;oBACvG,CAAC,CAAC,eAAe,IAAI,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,uBAAuB,EAAE,IAAI,EAAE,wBAAwB,EAAE,CAAC;wBAC3G,IAAI;oBACN,oFAAoF;oBACpF,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,kBAAkB,EAAE,IAAI,EAAE,WAAW,EAAE;iBACrE,CAAC,MAAM,CAAC,OAAO,CAAmD;aACpE;YACD,IAAI;YACJ,sBAAsB;YACtB,2BAA2B;YAC3B,qBAAqB;YACrB,gBAAgB;YAChB,uEAAuE;YACvE,uEAAuE;YACvE,8EAA8E;YAC9E,QAAQ;YACR,gCAAgC;YAChC,kCAAkC;YAClC,sBAAsB;YACtB,qBAAqB;YACrB,iCAAiC;YACjC,qBAAqB;YACrB,+BAA+B;YAC/B,qCAAqC;YACrC,oDAAoD;YACpD,cAAc;YACd,mBAAmB;YACnB,SAAS;YACT,QAAQ;YACR,iCAAiC;YACjC,mCAAmC;YACnC,2BAA2B;YAC3B,qBAAqB;YACrB,mBAAmB;YACnB,+DAA+D;YAC/D,2BAA2B;YAC3B,uBAAuB;YACvB,iCAAiC;YACjC,mCAAmC;YACnC,uDAAuD;YACvD,gBAAgB;YAChB,qBAAqB;YACrB,QAAQ;YACR,MAAM;YACN,KAAK;YACL;gBACE,IAAI,EAAE,OAAO;gBACb,IAAI,EAAE,mBAAmB;gBACzB,IAAI,EAAE,KAAK;gBACX,QAAQ,EAAE;oBACR,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,qBAAqB,EAAE,IAAI,EAAE,KAAK,EAAE;oBAC3D,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,UAAU,EAAE;oBACvD,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,KAAK,EAAE;iBACnD;aACF;YACD;gBACE,IAAI,EAAE,IAAI;gBACV,IAAI,EAAE,OAAO;gBACb,IAAI,EAAE,UAAU;gBAChB,QAAQ,EAAE;oBACR,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE;oBACjD,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,UAAU,EAAE;iBACrD;aACF;SACF,CAAA;IACH,CAAC;IAOD,MAAM;;QACJ,IAAI,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,EAAE,CAAA;QAC1B,OAAO,IAAI,CAAA;;UAEL,IAAI,CAAC,KAAK,CAAC,GAAG,CACd,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAA;;uBAEJ,CAAC,CAAQ,EAAE,EAAE;YACpB,CAAC,CAAC,eAAe,EAAE,CAAA;YACnB,IAAI,CAAC,eAAe,GAAG,CAAC,CAAA;YACxB,IAAI,CAAC,iBAAiB,EAAE,CAAA;QAC1B,CAAC;;qDAEsC,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC;2BACxD,IAAI,CAAC,IAAI;uBACb,IAAI,CAAC,IAAI;;;WAGrB,CACF;;QAED,IAAI,CAAC,eAAe,KAAK,IAAI;YAC7B,CAAC,CAAC,IAAI,CAAA;;;kBAGI,MAAA,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,QAAQ,0CAAE,GAAG,CAC9C,CAAC,GAAG,EAAE,QAAQ,EAAE,EAAE,CAAC,IAAI,CAAA;;;+BAGV,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI;kCAC9C,IAAI,CAAC,gBAAgB,CAAC,IAAI,EAAE,GAAG,CAAC;iCACjC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAQ,EAAE,EAAE,CAAC,CAAC,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,SAAS;;0BAErE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAA,YAAY,GAAG,CAAC,IAAI,YAAY,CAAC,CAAC,CAAC,EAAE,IAAI,GAAG,CAAC,IAAI;0BAChE,GAAG,CAAC,WAAW;gBACf,CAAC,CAAC,IAAI,CAAA;;uDAEuB,IAAI,CAAC,kBAAkB,KAAK,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE;yCACpE,CAAC,CAAQ,EAAE,EAAE,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,EAAE,QAAQ,CAAC;;;;6BAI7D;gBACH,CAAC,CAAC,EAAE;;wBAEN,GAAG,CAAC,WAAW,IAAI,IAAI,CAAC,kBAAkB,KAAK,QAAQ;gBACvD,CAAC,CAAC,IAAI,CAAA;;gCAEE,GAAG,CAAC,WAAW,CAAC,GAAG,CACnB,MAAM,CAAC,EAAE,CAAC,IAAI,CAAA;;8CAEA,MAAM,CAAC,IAAI,YAAY,IAAI,CAAC,mBAAmB,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC;wCACxE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAA,YAAY,MAAM,CAAC,IAAI,YAAY,CAAC,CAAC,CAAC,EAAE,IAAI,MAAM,CAAC,IAAI;;;iCAGhF,CACF;;2BAEJ;gBACH,CAAC,CAAC,EAAE;;mBAET,CACF;;;WAGN;YACH,CAAC,CAAC,EAAE;KACP,CAAA;IACH,CAAC;IAEO,aAAa,CAAC,WAAmB,EAAE,IAAS;QAClD,uBAAuB;QACvB,IAAI,WAAW,KAAK,IAAI,CAAC,IAAI;YAAE,OAAO,IAAI,CAAA;QAE1C,4BAA4B;QAC5B,IAAI,IAAI,CAAC,MAAM,IAAI,OAAO,IAAI,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;YACrD,IAAI,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;gBAAE,OAAO,IAAI,CAAA;QACrD,CAAC;QAED,0BAA0B;QAC1B,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,GAAQ,EAAE,EAAE;gBACrC,kBAAkB;gBAClB,IAAI,WAAW,KAAK,GAAG,CAAC,IAAI,IAAI,WAAW,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC;oBAAE,OAAO,IAAI,CAAA;gBAEnF,kCAAkC;gBAClC,IAAI,GAAG,CAAC,MAAM,IAAI,OAAO,GAAG,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;oBACnD,OAAO,GAAG,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAA;gBAC1C,CAAC;gBAED,OAAO,KAAK,CAAA;YACd,CAAC,CAAC,CAAA;QACJ,CAAC;QAED,OAAO,KAAK,CAAA;IACd,CAAC;IAEO,gBAAgB,CAAC,WAAmB,EAAE,OAAY;QACxD,gBAAgB;QAChB,IAAI,WAAW,KAAK,OAAO,CAAC,IAAI,IAAI,WAAW,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,GAAG,GAAG,CAAC;YAAE,OAAO,IAAI,CAAA;QAE3F,4BAA4B;QAC5B,IAAI,OAAO,CAAC,MAAM,IAAI,OAAO,OAAO,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;YAC3D,OAAO,OAAO,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAA;QAC9C,CAAC;QAED,OAAO,KAAK,CAAA;IACd,CAAC;IAED,KAAK,CAAC,YAAY;QAChB,IAAI,CAAC,iBAAiB,EAAE,CAAA;QAExB,IAAI,CAAC,QAAQ,GAAG,MAAM,aAAa,EAAE,CAAA;QACrC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAA;IAC9B,CAAC;IAED,OAAO,CAAC,YAA8B;QACpC,IAAI,YAAY,CAAC,GAAG,CAAC,iBAAiB,CAAC,EAAE,CAAC;YACxC,IAAI,CAAC,iBAAiB,EAAE,CAAA;QAC1B,CAAC;IACH,CAAC;IAED,iBAAiB;QACf,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,MAAM,CAAC,YAAY,CAAA;QAC/C,CAAC;IACH,CAAC;IAED,iBAAiB;QACf,KAAK,CAAC,iBAAiB,EAAE,CAAA;QACzB,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAAC,aAAa,CAAC,CAAA;IACtD,CAAC;IAED,oBAAoB;QAClB,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,IAAI,CAAC,aAAa,CAAC,CAAA;QACvD,KAAK,CAAC,oBAAoB,EAAE,CAAA;IAC9B,CAAC;IAMO,iBAAiB,CAAC,CAAQ,EAAE,QAAgB;QAClD,CAAC,CAAC,eAAe,EAAE,CAAA;QACnB,IAAI,IAAI,CAAC,kBAAkB,KAAK,QAAQ,EAAE,CAAC;YACzC,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAA;QAChC,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,kBAAkB,GAAG,QAAQ,CAAA;QACpC,CAAC;IACH,CAAC;IAEO,mBAAmB,CAAC,WAAmB,EAAE,UAAe;QAC9D,gBAAgB;QAChB,IAAI,WAAW,KAAK,UAAU,CAAC,IAAI,IAAI,WAAW,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,GAAG,GAAG,CAAC;YAAE,OAAO,IAAI,CAAA;QAEjG,4BAA4B;QAC5B,IAAI,UAAU,CAAC,MAAM,IAAI,OAAO,UAAU,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;YACjE,OAAO,UAAU,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAA;QACjD,CAAC;QAED,OAAO,KAAK,CAAA;IACd,CAAC;IAED,YAAY,CAAC,KAAU;QACrB,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAA;QAC5B,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK,CAAA;IACjC,CAAC;;AAjgBM,gBAAM,GAAG;IACd,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAyMF;CACF,AA3MY,CA2MZ;AAE2B;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;uCAAc;AACE;IAA1C,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;;wCAAe;AAEhD;IAAR,KAAK,EAAE;;2CAAqB;AACpB;IAAR,KAAK,EAAE;;wCAYa;AAyHO;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;kDAAsC;AACrC;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;qDAAyC;AACvD;IAAZ,KAAK,CAAC,IAAI,CAAC;8BAAU,gBAAgB;yCAAA;AACV;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;gDAAoC;AA1VpD,SAAS;IADrB,aAAa,CAAC,YAAY,CAAC;GACf,SAAS,CAmgBrB","sourcesContent":["import '@material/web/icon/icon.js'\n\nimport gql from 'graphql-tag'\nimport { css, html, LitElement } from 'lit'\nimport { customElement, property, query, state } from 'lit/decorators.js'\n\nimport { store, connect } from '@operato/shell'\nimport { client } from '@operato/graphql'\nimport { i18next } from '@operato/i18n'\n\nimport { isProjectTypeDomain } from '@dssp/project/dist-client/shared/domain-context'\n\n// import { ICONS_HOME, ICONS_KPIS, ICONS_INTEGRATION, ICONS_SETTING } from '../icons/menu-icons'\nexport async function queryDataSets(): Promise<{ id: string; name: string; description: string; active: boolean }[]> {\n const response = await client.query({\n query: gql`\n query ($filters: [Filter!], $pagination: Pagination, $sortings: [Sorting!]) {\n responses: dataSets(filters: $filters, pagination: $pagination, sortings: $sortings) {\n items {\n id\n name\n description\n active\n summaryPeriod\n }\n total\n }\n }\n `,\n variables: {\n filters: [\n {\n name: 'active',\n operator: 'eq',\n value: true\n }\n ],\n pagination: {},\n sortings: []\n }\n })\n\n return response.data.responses.items\n}\n\n@customElement('menu-tools')\nexport class MenuTools extends connect(store)(LitElement) {\n static styles = [\n css`\n :host {\n position: relative;\n display: flex;\n background-color: var(--secondary-color);\n\n /* for narrow mode */\n flex-direction: column;\n width: 100%;\n --menu-tools-color: rgba(255, 255, 255, 0.9);\n --menu-tools-active-color: rgba(107, 178, 249, 1);\n }\n\n :host([width='WIDE']) {\n /* for wide mode */\n flex-direction: row;\n width: initial;\n height: 100%;\n }\n\n ul {\n display: flex;\n flex-direction: row;\n\n margin: auto;\n padding: 0;\n list-style: none;\n height: 100%;\n overflow: none;\n }\n\n :host([width='NARROW']) ul {\n width: 100%;\n justify-content: space-around;\n }\n\n :host([width='WIDE']) ul {\n flex-direction: column;\n }\n :host([width='NARROW']) li {\n flex: 1;\n }\n\n :host([width='WIDE']) li {\n border-top: 1px solid rgba(255, 255, 255, 0.1);\n border-bottom: 1px solid rgba(0, 0, 0, 0.1);\n }\n\n a {\n display: flex;\n flex-direction: column;\n padding: 8px 8px 4px 8px;\n opacity: 0.7;\n align-items: center;\n text-align: center;\n text-decoration: none;\n text-transform: capitalize;\n color: var(--menu-tools-color);\n border-left: 2px solid transparent;\n\n --md-icon-size: 36px;\n }\n\n a[active] {\n opacity: 1;\n color: var(--menu-tools-active-color);\n font-weight: bold;\n background-color: rgba(0, 0, 0, 0.15);\n border-left: 2px solid var(--menu-tools-active-color);\n }\n\n :host([width='NARROW']) a {\n padding: 0px 0px 5px 0px;\n opacity: 0.8;\n color: var(--menu-tools-color);\n border-left: none;\n border-top: 2px solid transparent;\n }\n\n :host([width='NARROW']) a[active] {\n opacity: 1;\n color: var(--menu-tools-active-color);\n font-weight: bold;\n background-color: rgba(0, 0, 0, 0.15);\n border-left: none;\n border-top: 2px solid var(--menu-tools-active-color);\n }\n\n img {\n display: block;\n width: 35px;\n padding: 5px 10px 0px 10px;\n }\n\n :host([width='NARROW']) img {\n padding: 0;\n }\n\n div {\n font-size: 0.6em;\n }\n\n .submenu-popup {\n position: absolute;\n left: 60px; /* 탑메뉴 width */\n top: 0;\n width: 220px;\n height: 100%;\n background: linear-gradient(135deg, #1e293b 0%, #334155 100%);\n color: #fff;\n box-shadow: 2px 0 8px rgba(0, 0, 0, 0.15);\n z-index: 1000;\n display: flex;\n flex-direction: column;\n border-radius: 0 10px 10px 0;\n }\n\n .submenu-popup ul {\n list-style: none;\n margin: 0;\n padding: 0;\n }\n\n .submenu-popup li {\n font-size: 1.1em;\n }\n\n .submenu-popup li a {\n color: #fff;\n text-decoration: none;\n display: flex;\n flex-direction: row;\n align-items: center;\n gap: 12px;\n transition: background 0.2s;\n padding: 12px 16px;\n }\n\n .submenu-popup li a:hover {\n background: #333;\n }\n\n .submenu-popup li a md-icon {\n --md-icon-size: 20px;\n color: rgba(255, 255, 255, 0.8);\n }\n\n .submenu-popup li a[active] md-icon {\n color: var(--menu-tools-active-color);\n }\n .submenu-popup li {\n position: relative;\n }\n .subsubmenu {\n margin-left: 20px;\n margin-top: 8px;\n border-left: 2px solid rgba(255, 255, 255, 0.2);\n padding-left: 12px;\n }\n .subsubmenu li {\n padding: 8px 16px;\n font-size: 0.9em;\n }\n .subsubmenu li a {\n padding: 8px 12px;\n font-size: 0.85em;\n opacity: 0.8;\n }\n .subsubmenu li a:hover {\n opacity: 1;\n background: rgba(255, 255, 255, 0.1);\n }\n .subsubmenu li a[active] {\n opacity: 1;\n color: var(--menu-tools-active-color);\n background: rgba(107, 178, 249, 0.2);\n }\n .subsubmenu li a md-icon {\n --md-icon-size: 16px;\n }\n .expand-button {\n margin-left: auto;\n background: none;\n border: none;\n color: rgba(255, 255, 255, 0.6);\n cursor: pointer;\n padding: 4px;\n border-radius: 4px;\n transition: all 0.2s;\n }\n .expand-button:hover {\n color: rgba(255, 255, 255, 0.9);\n background: rgba(255, 255, 255, 0.1);\n }\n .expand-button md-icon {\n --md-icon-size: 16px;\n transition: transform 0.2s;\n }\n .expand-button.expanded md-icon {\n transform: rotate(90deg);\n }\n `\n ]\n\n @property({ type: String }) page?: string\n @property({ type: String, reflect: true }) width?: string\n\n @state() dataSets: any[] = []\n @state() menus: {\n name: string\n path: string\n icon: string\n active?: ({ path }: { path: string }) => boolean\n submenus?: {\n name: string\n path: string\n icon?: string\n active?: ({ path }: { path: string }) => boolean\n subsubmenus?: { name: string; path: string; icon?: string; active?: ({ path }: { path: string }) => boolean }[]\n }[]\n }[] = this.getMenus()\n\n private getMenus(): {\n name: string\n path: string\n icon: string\n active?: ({ path }: { path: string }) => boolean\n submenus?: {\n name: string\n path: string\n icon?: string\n active?: ({ path }: { path: string }) => boolean\n subsubmenus?: { name: string; path: string; icon?: string; active?: ({ path }: { path: string }) => boolean }[]\n }[]\n }[] {\n const dataSets = this.dataSets\n const isProjectDomain = isProjectTypeDomain()\n\n // 일반(=비-project) 도메인의 home: 프로젝트 목록 중심\n const generalHomeMenu = {\n name: '홈',\n path: 'project-list',\n icon: 'location_city',\n active: ({ path }: { path: string }) => /^project/.test(path),\n submenus: [\n { name: 'KPI 대시보드', path: 'kpi-dashboard-map', icon: 'dashboard' },\n { name: '프로젝트 목록', path: 'project-list', icon: 'autoplay' },\n { name: '완료 프로젝트 목록', path: 'project-completed-list', icon: 'stop_circle' }\n ]\n }\n\n // PROJECT 도메인의 home: 단일 프로젝트의 KPI 대시보드 + 프로젝트 수정 + 완공처리\n const projectHomeMenu = {\n name: '프로젝트',\n path: 'project-overview',\n icon: 'apartment',\n active: ({ path }: { path: string }) => /^(kpi-overview|project-detail|project-complete)/.test(path),\n submenus: [\n { name: '프로젝트 대시보드', path: 'project-detail', icon: 'dashboard' },\n { name: '프로젝트 수정', path: 'project-update', icon: 'edit_note' },\n { name: 'KPI 데이타입력', path: 'project-complete', icon: 'edit_note' }\n ]\n }\n\n return [\n isProjectDomain ? projectHomeMenu : generalHomeMenu,\n {\n name: 'KPI',\n path: 'kpi-overview',\n icon: 'bar_chart',\n submenus: [\n { name: 'KPI 개요', path: 'kpi-overview', icon: 'widget_small' },\n (!isProjectDomain && { name: 'KPI 목록', path: 'kpi-list', icon: 'readiness_score' }) || null,\n (!isProjectDomain && { name: 'KPI 값 목록', path: 'kpi-value-list', icon: 'heap_snapshot_multiple' }) || null,\n (!isProjectDomain && { name: 'KPI 메트릭 목록', path: 'kpi-metric-list', icon: 'data_exploration' }) || null,\n (!isProjectDomain && { name: 'KPI 메트릭 값 목록', path: 'kpi-metric-value-list', icon: 'heap_snapshot_multiple' }) ||\n null,\n // { name: 'KPI 매트릭 값 수동 입력', path: 'kpi-metric-value-manual-entry', icon: 'edit' },\n { name: 'KPI 시스템 가이드', path: 'kpi-system-guide', icon: 'menu_book' }\n ].filter(Boolean) as { name: string; path: string; icon: string }[]\n },\n // {\n // name: 'Data Set',\n // path: 'data-set-list',\n // icon: 'dataset',\n // submenus: [\n // { name: 'Data Set 목록', path: 'data-set-list', icon: 'dataset' },\n // { name: 'Data Key 목록', path: 'data-key-set-list', icon: 'key' },\n // { name: 'Data Sample 값 수동 입력', path: 'data-entry-list', icon: 'edit' },\n // {\n // name: 'Data Sample 목록',\n // path: 'data-sample-list',\n // icon: 'rule',\n // subsubmenus:\n // dataSets.map(item => {\n // return {\n // name: item.name,\n // icon: 'checklist_rtl',\n // path: `data-sample-search/${item.id}`\n // }\n // }) || []\n // },\n // {\n // name: 'Data Summary 목록',\n // path: 'data-summary-list',\n // icon: 'functions',\n // subsubmenus:\n // dataSets\n // .filter(item => item.active && item.summaryPeriod)\n // .map(item => {\n // return {\n // name: item.name,\n // icon: 'checklist',\n // path: `data-summary-period/${item.id}`\n // }\n // }) || []\n // }\n // ]\n // },\n {\n name: '시스템연계',\n path: 'project-task-list',\n icon: 'hub',\n submenus: [\n { name: '연계 현황', path: 'integration-monitor', icon: 'hub' },\n { name: '연계 설정', path: 'connection', icon: 'settings' },\n { name: '연계 시나리오', path: 'scenario', icon: 'hub' }\n ]\n },\n {\n name: '셋팅',\n path: 'users',\n icon: 'settings',\n submenus: [\n { name: '사용자 관리', path: 'users', icon: 'people' },\n { name: '환경 설정', path: 'setting', icon: 'settings' }\n ]\n }\n ]\n }\n\n @property({ type: Number }) openedMenuIndex: number | null = null\n @property({ type: Number }) openedSubmenuIndex: number | null = null\n @query('ul') menuUl!: HTMLUListElement\n @property({ type: Number }) submenuHeight: number | null = null\n\n render() {\n var page = this.page || ''\n return html`\n <ul>\n ${this.menus.map(\n (menu, i) => html`\n <li\n @click=${(e: Event) => {\n e.stopPropagation()\n this.openedMenuIndex = i\n this._setSubmenuHeight()\n }}\n >\n <a href=\"javascript:void(0)\" ?active=${this._isActiveMenu(page, menu)}>\n <md-icon>${menu.icon}</md-icon>\n <div>${menu.name}</div>\n </a>\n </li>\n `\n )}\n </ul>\n ${this.openedMenuIndex !== null\n ? html`\n <div class=\"submenu-popup\">\n <ul>\n ${this.menus[this.openedMenuIndex].submenus?.map(\n (sub, subIndex) => html`\n <li>\n <a\n href=${sub.subsubmenus ? 'javascript:void(0)' : sub.path}\n ?active=${this._isActiveSubmenu(page, sub)}\n @click=${sub.subsubmenus ? (e: Event) => e.preventDefault() : undefined}\n >\n ${sub.icon ? html`<md-icon>${sub.icon}</md-icon>` : ''} ${sub.name}\n ${sub.subsubmenus\n ? html`\n <button\n class=\"expand-button ${this.openedSubmenuIndex === subIndex ? 'expanded' : ''}\"\n @click=${(e: Event) => this._toggleSubsubmenu(e, subIndex)}\n >\n <md-icon>chevron_right</md-icon>\n </button>\n `\n : ''}\n </a>\n ${sub.subsubmenus && this.openedSubmenuIndex === subIndex\n ? html`\n <ul class=\"subsubmenu\">\n ${sub.subsubmenus.map(\n subsub => html`\n <li>\n <a href=${subsub.path} ?active=${this._isActiveSubsubmenu(page, subsub.path)}>\n ${subsub.icon ? html`<md-icon>${subsub.icon}</md-icon>` : ''} ${subsub.name}\n </a>\n </li>\n `\n )}\n </ul>\n `\n : ''}\n </li>\n `\n )}\n </ul>\n </div>\n `\n : ''}\n `\n }\n\n private _isActiveMenu(currentPage: string, menu: any): boolean {\n // 메인 메뉴의 기본 path 매칭 확인\n if (currentPage === menu.path) return true\n\n // 커스텀 active 함수가 있으면 추가로 확인\n if (menu.active && typeof menu.active === 'function') {\n if (menu.active({ path: currentPage })) return true\n }\n\n // 서브메뉴 중 하나라도 active인지 확인\n if (menu.submenus) {\n return menu.submenus.some((sub: any) => {\n // 서브메뉴 기본 path 매칭\n if (currentPage === sub.path || currentPage.startsWith(sub.path + '/')) return true\n\n // 서브메뉴에 커스텀 active 함수가 있으면 추가로 확인\n if (sub.active && typeof sub.active === 'function') {\n return sub.active({ path: currentPage })\n }\n\n return false\n })\n }\n\n return false\n }\n\n private _isActiveSubmenu(currentPage: string, submenu: any): boolean {\n // 기본 path 매칭 확인\n if (currentPage === submenu.path || currentPage.startsWith(submenu.path + '/')) return true\n\n // 커스텀 active 함수가 있으면 추가로 확인\n if (submenu.active && typeof submenu.active === 'function') {\n return submenu.active({ path: currentPage })\n }\n\n return false\n }\n\n async firstUpdated() {\n this._setSubmenuHeight()\n\n this.dataSets = await queryDataSets()\n this.menus = this.getMenus()\n }\n\n updated(changedProps: Map<string, any>) {\n if (changedProps.has('openedMenuIndex')) {\n this._setSubmenuHeight()\n }\n }\n\n _setSubmenuHeight() {\n if (this.menuUl) {\n this.submenuHeight = this.menuUl.clientHeight\n }\n }\n\n connectedCallback() {\n super.connectedCallback()\n window.addEventListener('click', this._closeSubmenu)\n }\n\n disconnectedCallback() {\n window.removeEventListener('click', this._closeSubmenu)\n super.disconnectedCallback()\n }\n\n private _closeSubmenu = () => {\n this.openedMenuIndex = null\n }\n\n private _toggleSubsubmenu(e: Event, subIndex: number) {\n e.stopPropagation()\n if (this.openedSubmenuIndex === subIndex) {\n this.openedSubmenuIndex = null\n } else {\n this.openedSubmenuIndex = subIndex\n }\n }\n\n private _isActiveSubsubmenu(currentPage: string, subsubmenu: any): boolean {\n // 기본 path 매칭 확인\n if (currentPage === subsubmenu.path || currentPage.startsWith(subsubmenu.path + '/')) return true\n\n // 커스텀 active 함수가 있으면 추가로 확인\n if (subsubmenu.active && typeof subsubmenu.active === 'function') {\n return subsubmenu.active({ path: currentPage })\n }\n\n return false\n }\n\n stateChanged(state: any) {\n this.page = state.route.page\n this.width = state.layout.width\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"menu-tools.js","sourceRoot":"","sources":["../../client/viewparts/menu-tools.ts"],"names":[],"mappings":";AAAA,OAAO,4BAA4B,CAAA;AAEnC,OAAO,GAAG,MAAM,aAAa,CAAA;AAC7B,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,KAAK,CAAA;AAC3C,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAA;AAEzE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAA;AAC/C,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AAGzC,OAAO,EAAE,mBAAmB,EAAE,MAAM,iDAAiD,CAAA;AAErF,iGAAiG;AACjG,MAAM,CAAC,KAAK,UAAU,aAAa;IACjC,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC;QAClC,KAAK,EAAE,GAAG,CAAA;;;;;;;;;;;;;KAaT;QACD,SAAS,EAAE;YACT,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,QAAQ;oBACd,QAAQ,EAAE,IAAI;oBACd,KAAK,EAAE,IAAI;iBACZ;aACF;YACD,UAAU,EAAE,EAAE;YACd,QAAQ,EAAE,EAAE;SACb;KACF,CAAC,CAAA;IAEF,OAAO,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAA;AACtC,CAAC;AAGM,IAAM,SAAS,GAAf,MAAM,SAAU,SAAQ,OAAO,CAAC,KAAK,CAAC,CAAC,UAAU,CAAC;IAAlD;;QAiNI,aAAQ,GAAU,EAAE,CAAA;QACpB,UAAK,GAYR,IAAI,CAAC,QAAQ,EAAE,CAAA;QAyHO,oBAAe,GAAkB,IAAI,CAAA;QACrC,uBAAkB,GAAkB,IAAI,CAAA;QAExC,kBAAa,GAAkB,IAAI,CAAA;QA+IvD,kBAAa,GAAG,CAAC,CAAa,EAAE,EAAE;YACxC,MAAM,IAAI,GAAG,CAAC,CAAC,YAAY,EAAE,CAAA;YAC7B,0CAA0C;YAC1C,sDAAsD;YACtD,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;gBACxB,yCAAyC;gBACzC,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CACzB,EAAE,CAAC,EAAE,CACH,EAAE,YAAY,iBAAiB;oBAC/B,CAAC,CAAC,EAAE,CAAC,YAAY,CAAC,MAAM,CAAC;oBACzB,EAAE,CAAC,YAAY,CAAC,MAAM,CAAC,KAAK,oBAAoB,CACnD,CAAA;gBACD,IAAI,CAAC,SAAS;oBAAE,OAAM;YACxB,CAAC;YACD,IAAI,CAAC,eAAe,GAAG,IAAI,CAAA;QAC7B,CAAC,CAAA;IA2BH,CAAC;IAnTS,QAAQ;QAad,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAA;QAC9B,MAAM,eAAe,GAAG,mBAAmB,EAAE,CAAA;QAE7C,uCAAuC;QACvC,MAAM,eAAe,GAAG;YACtB,IAAI,EAAE,GAAG;YACT,IAAI,EAAE,cAAc;YACpB,IAAI,EAAE,eAAe;YACrB,MAAM,EAAE,CAAC,EAAE,IAAI,EAAoB,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC;YAC7D,QAAQ,EAAE;gBACR,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,mBAAmB,EAAE,IAAI,EAAE,WAAW,EAAE;gBAClE,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,UAAU,EAAE;gBAC3D,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,wBAAwB,EAAE,IAAI,EAAE,aAAa,EAAE;aAC5E;SACF,CAAA;QAED,wDAAwD;QACxD,MAAM,eAAe,GAAG;YACtB,IAAI,EAAE,MAAM;YACZ,IAAI,EAAE,kBAAkB;YACxB,IAAI,EAAE,WAAW;YACjB,MAAM,EAAE,CAAC,EAAE,IAAI,EAAoB,EAAE,EAAE,CAAC,iDAAiD,CAAC,IAAI,CAAC,IAAI,CAAC;YACpG,QAAQ,EAAE;gBACR,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,gBAAgB,EAAE,IAAI,EAAE,WAAW,EAAE;gBAChE,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,gBAAgB,EAAE,IAAI,EAAE,WAAW,EAAE;gBAC9D,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,kBAAkB,EAAE,IAAI,EAAE,WAAW,EAAE;aACnE;SACF,CAAA;QAED,OAAO;YACL,eAAe,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,eAAe;YACnD;gBACE,IAAI,EAAE,KAAK;gBACX,IAAI,EAAE,cAAc;gBACpB,IAAI,EAAE,WAAW;gBACjB,QAAQ,EAAE;oBACR,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,cAAc,EAAE;oBAC9D,CAAC,CAAC,eAAe,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,iBAAiB,EAAE,CAAC,IAAI,IAAI;oBAC3F,CAAC,CAAC,eAAe,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,gBAAgB,EAAE,IAAI,EAAE,wBAAwB,EAAE,CAAC,IAAI,IAAI;oBAC1G,CAAC,CAAC,eAAe,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,iBAAiB,EAAE,IAAI,EAAE,kBAAkB,EAAE,CAAC,IAAI,IAAI;oBACvG,CAAC,CAAC,eAAe,IAAI,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,uBAAuB,EAAE,IAAI,EAAE,wBAAwB,EAAE,CAAC;wBAC3G,IAAI;oBACN,oFAAoF;oBACpF,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,kBAAkB,EAAE,IAAI,EAAE,WAAW,EAAE;iBACrE,CAAC,MAAM,CAAC,OAAO,CAAmD;aACpE;YACD,IAAI;YACJ,sBAAsB;YACtB,2BAA2B;YAC3B,qBAAqB;YACrB,gBAAgB;YAChB,uEAAuE;YACvE,uEAAuE;YACvE,8EAA8E;YAC9E,QAAQ;YACR,gCAAgC;YAChC,kCAAkC;YAClC,sBAAsB;YACtB,qBAAqB;YACrB,iCAAiC;YACjC,qBAAqB;YACrB,+BAA+B;YAC/B,qCAAqC;YACrC,oDAAoD;YACpD,cAAc;YACd,mBAAmB;YACnB,SAAS;YACT,QAAQ;YACR,iCAAiC;YACjC,mCAAmC;YACnC,2BAA2B;YAC3B,qBAAqB;YACrB,mBAAmB;YACnB,+DAA+D;YAC/D,2BAA2B;YAC3B,uBAAuB;YACvB,iCAAiC;YACjC,mCAAmC;YACnC,uDAAuD;YACvD,gBAAgB;YAChB,qBAAqB;YACrB,QAAQ;YACR,MAAM;YACN,KAAK;YACL;gBACE,IAAI,EAAE,OAAO;gBACb,IAAI,EAAE,mBAAmB;gBACzB,IAAI,EAAE,KAAK;gBACX,QAAQ,EAAE;oBACR,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,qBAAqB,EAAE,IAAI,EAAE,KAAK,EAAE;oBAC3D,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,UAAU,EAAE;oBACvD,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,KAAK,EAAE;iBACnD;aACF;YACD;gBACE,IAAI,EAAE,IAAI;gBACV,IAAI,EAAE,OAAO;gBACb,IAAI,EAAE,UAAU;gBAChB,QAAQ,EAAE;oBACR,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE;oBACjD,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,UAAU,EAAE;iBACrD;aACF;SACF,CAAA;IACH,CAAC;IAOD,MAAM;;QACJ,IAAI,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,EAAE,CAAA;QAC1B,OAAO,IAAI,CAAA;;UAEL,IAAI,CAAC,KAAK,CAAC,GAAG,CACd,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAA;;uBAEJ,CAAC,CAAQ,EAAE,EAAE;YACpB,CAAC,CAAC,eAAe,EAAE,CAAA;YACnB,IAAI,CAAC,eAAe,GAAG,CAAC,CAAA;YACxB,IAAI,CAAC,iBAAiB,EAAE,CAAA;QAC1B,CAAC;;qDAEsC,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC;2BACxD,IAAI,CAAC,IAAI;uBACb,IAAI,CAAC,IAAI;;;WAGrB,CACF;;QAED,IAAI,CAAC,eAAe,KAAK,IAAI;YAC7B,CAAC,CAAC,IAAI,CAAA;;;kBAGI,MAAA,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,QAAQ,0CAAE,GAAG,CAC9C,CAAC,GAAG,EAAE,QAAQ,EAAE,EAAE,CAAC,IAAI,CAAA;;;+BAGV,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI;kCAC9C,IAAI,CAAC,gBAAgB,CAAC,IAAI,EAAE,GAAG,CAAC;iCACjC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAQ,EAAE,EAAE,CAAC,CAAC,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,SAAS;;0BAErE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAA,YAAY,GAAG,CAAC,IAAI,YAAY,CAAC,CAAC,CAAC,EAAE,IAAI,GAAG,CAAC,IAAI;0BAChE,GAAG,CAAC,WAAW;gBACf,CAAC,CAAC,IAAI,CAAA;;uDAEuB,IAAI,CAAC,kBAAkB,KAAK,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE;yCACpE,CAAC,CAAQ,EAAE,EAAE,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,EAAE,QAAQ,CAAC;;;;6BAI7D;gBACH,CAAC,CAAC,EAAE;;wBAEN,GAAG,CAAC,WAAW,IAAI,IAAI,CAAC,kBAAkB,KAAK,QAAQ;gBACvD,CAAC,CAAC,IAAI,CAAA;;gCAEE,GAAG,CAAC,WAAW,CAAC,GAAG,CACnB,MAAM,CAAC,EAAE,CAAC,IAAI,CAAA;;8CAEA,MAAM,CAAC,IAAI,YAAY,IAAI,CAAC,mBAAmB,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC;wCACxE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAA,YAAY,MAAM,CAAC,IAAI,YAAY,CAAC,CAAC,CAAC,EAAE,IAAI,MAAM,CAAC,IAAI;;;iCAGhF,CACF;;2BAEJ;gBACH,CAAC,CAAC,EAAE;;mBAET,CACF;;;WAGN;YACH,CAAC,CAAC,EAAE;KACP,CAAA;IACH,CAAC;IAEO,aAAa,CAAC,WAAmB,EAAE,IAAS;QAClD,uBAAuB;QACvB,IAAI,WAAW,KAAK,IAAI,CAAC,IAAI;YAAE,OAAO,IAAI,CAAA;QAE1C,4BAA4B;QAC5B,IAAI,IAAI,CAAC,MAAM,IAAI,OAAO,IAAI,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;YACrD,IAAI,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;gBAAE,OAAO,IAAI,CAAA;QACrD,CAAC;QAED,0BAA0B;QAC1B,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,GAAQ,EAAE,EAAE;gBACrC,kBAAkB;gBAClB,IAAI,WAAW,KAAK,GAAG,CAAC,IAAI,IAAI,WAAW,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC;oBAAE,OAAO,IAAI,CAAA;gBAEnF,kCAAkC;gBAClC,IAAI,GAAG,CAAC,MAAM,IAAI,OAAO,GAAG,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;oBACnD,OAAO,GAAG,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAA;gBAC1C,CAAC;gBAED,OAAO,KAAK,CAAA;YACd,CAAC,CAAC,CAAA;QACJ,CAAC;QAED,OAAO,KAAK,CAAA;IACd,CAAC;IAEO,gBAAgB,CAAC,WAAmB,EAAE,OAAY;QACxD,gBAAgB;QAChB,IAAI,WAAW,KAAK,OAAO,CAAC,IAAI,IAAI,WAAW,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,GAAG,GAAG,CAAC;YAAE,OAAO,IAAI,CAAA;QAE3F,4BAA4B;QAC5B,IAAI,OAAO,CAAC,MAAM,IAAI,OAAO,OAAO,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;YAC3D,OAAO,OAAO,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAA;QAC9C,CAAC;QAED,OAAO,KAAK,CAAA;IACd,CAAC;IAED,KAAK,CAAC,YAAY;QAChB,IAAI,CAAC,iBAAiB,EAAE,CAAA;QAExB,IAAI,CAAC,QAAQ,GAAG,MAAM,aAAa,EAAE,CAAA;QACrC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAA;IAC9B,CAAC;IAED,OAAO,CAAC,YAA8B;QACpC,IAAI,YAAY,CAAC,GAAG,CAAC,iBAAiB,CAAC,EAAE,CAAC;YACxC,IAAI,CAAC,iBAAiB,EAAE,CAAA;QAC1B,CAAC;IACH,CAAC;IAED,iBAAiB;QACf,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,MAAM,CAAC,YAAY,CAAA;QAC/C,CAAC;IACH,CAAC;IAED,iBAAiB;QACf,KAAK,CAAC,iBAAiB,EAAE,CAAA;QACzB,sDAAsD;QACtD,wDAAwD;QACxD,sDAAsD;QACtD,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,CAAA;IAC5D,CAAC;IAED,oBAAoB;QAClB,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,CAAA;QAC7D,KAAK,CAAC,oBAAoB,EAAE,CAAA;IAC9B,CAAC;IAmBO,iBAAiB,CAAC,CAAQ,EAAE,QAAgB;QAClD,CAAC,CAAC,eAAe,EAAE,CAAA;QACnB,IAAI,IAAI,CAAC,kBAAkB,KAAK,QAAQ,EAAE,CAAC;YACzC,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAA;QAChC,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,kBAAkB,GAAG,QAAQ,CAAA;QACpC,CAAC;IACH,CAAC;IAEO,mBAAmB,CAAC,WAAmB,EAAE,UAAe;QAC9D,gBAAgB;QAChB,IAAI,WAAW,KAAK,UAAU,CAAC,IAAI,IAAI,WAAW,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,GAAG,GAAG,CAAC;YAAE,OAAO,IAAI,CAAA;QAEjG,4BAA4B;QAC5B,IAAI,UAAU,CAAC,MAAM,IAAI,OAAO,UAAU,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;YACjE,OAAO,UAAU,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAA;QACjD,CAAC;QAED,OAAO,KAAK,CAAA;IACd,CAAC;IAED,YAAY,CAAC,KAAU;QACrB,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAA;QAC5B,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK,CAAA;IACjC,CAAC;;AAjhBM,gBAAM,GAAG;IACd,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAyMF;CACF,AA3MY,CA2MZ;AAE2B;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;uCAAc;AACE;IAA1C,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;;wCAAe;AAEhD;IAAR,KAAK,EAAE;;2CAAqB;AACpB;IAAR,KAAK,EAAE;;wCAYa;AAyHO;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;kDAAsC;AACrC;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;qDAAyC;AACvD;IAAZ,KAAK,CAAC,IAAI,CAAC;8BAAU,gBAAgB;yCAAA;AACV;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;gDAAoC;AA1VpD,SAAS;IADrB,aAAa,CAAC,YAAY,CAAC;GACf,SAAS,CAmhBrB","sourcesContent":["import '@material/web/icon/icon.js'\n\nimport gql from 'graphql-tag'\nimport { css, html, LitElement } from 'lit'\nimport { customElement, property, query, state } from 'lit/decorators.js'\n\nimport { store, connect } from '@operato/shell'\nimport { client } from '@operato/graphql'\nimport { i18next } from '@operato/i18n'\n\nimport { isProjectTypeDomain } from '@dssp/project/dist-client/shared/domain-context'\n\n// import { ICONS_HOME, ICONS_KPIS, ICONS_INTEGRATION, ICONS_SETTING } from '../icons/menu-icons'\nexport async function queryDataSets(): Promise<{ id: string; name: string; description: string; active: boolean }[]> {\n const response = await client.query({\n query: gql`\n query ($filters: [Filter!], $pagination: Pagination, $sortings: [Sorting!]) {\n responses: dataSets(filters: $filters, pagination: $pagination, sortings: $sortings) {\n items {\n id\n name\n description\n active\n summaryPeriod\n }\n total\n }\n }\n `,\n variables: {\n filters: [\n {\n name: 'active',\n operator: 'eq',\n value: true\n }\n ],\n pagination: {},\n sortings: []\n }\n })\n\n return response.data.responses.items\n}\n\n@customElement('menu-tools')\nexport class MenuTools extends connect(store)(LitElement) {\n static styles = [\n css`\n :host {\n position: relative;\n display: flex;\n background-color: var(--secondary-color);\n\n /* for narrow mode */\n flex-direction: column;\n width: 100%;\n --menu-tools-color: rgba(255, 255, 255, 0.9);\n --menu-tools-active-color: rgba(107, 178, 249, 1);\n }\n\n :host([width='WIDE']) {\n /* for wide mode */\n flex-direction: row;\n width: initial;\n height: 100%;\n }\n\n ul {\n display: flex;\n flex-direction: row;\n\n margin: auto;\n padding: 0;\n list-style: none;\n height: 100%;\n overflow: none;\n }\n\n :host([width='NARROW']) ul {\n width: 100%;\n justify-content: space-around;\n }\n\n :host([width='WIDE']) ul {\n flex-direction: column;\n }\n :host([width='NARROW']) li {\n flex: 1;\n }\n\n :host([width='WIDE']) li {\n border-top: 1px solid rgba(255, 255, 255, 0.1);\n border-bottom: 1px solid rgba(0, 0, 0, 0.1);\n }\n\n a {\n display: flex;\n flex-direction: column;\n padding: 8px 8px 4px 8px;\n opacity: 0.7;\n align-items: center;\n text-align: center;\n text-decoration: none;\n text-transform: capitalize;\n color: var(--menu-tools-color);\n border-left: 2px solid transparent;\n\n --md-icon-size: 36px;\n }\n\n a[active] {\n opacity: 1;\n color: var(--menu-tools-active-color);\n font-weight: bold;\n background-color: rgba(0, 0, 0, 0.15);\n border-left: 2px solid var(--menu-tools-active-color);\n }\n\n :host([width='NARROW']) a {\n padding: 0px 0px 5px 0px;\n opacity: 0.8;\n color: var(--menu-tools-color);\n border-left: none;\n border-top: 2px solid transparent;\n }\n\n :host([width='NARROW']) a[active] {\n opacity: 1;\n color: var(--menu-tools-active-color);\n font-weight: bold;\n background-color: rgba(0, 0, 0, 0.15);\n border-left: none;\n border-top: 2px solid var(--menu-tools-active-color);\n }\n\n img {\n display: block;\n width: 35px;\n padding: 5px 10px 0px 10px;\n }\n\n :host([width='NARROW']) img {\n padding: 0;\n }\n\n div {\n font-size: 0.6em;\n }\n\n .submenu-popup {\n position: absolute;\n left: 60px; /* 탑메뉴 width */\n top: 0;\n width: 220px;\n height: 100%;\n background: linear-gradient(135deg, #1e293b 0%, #334155 100%);\n color: #fff;\n box-shadow: 2px 0 8px rgba(0, 0, 0, 0.15);\n z-index: 1000;\n display: flex;\n flex-direction: column;\n border-radius: 0 10px 10px 0;\n }\n\n .submenu-popup ul {\n list-style: none;\n margin: 0;\n padding: 0;\n }\n\n .submenu-popup li {\n font-size: 1.1em;\n }\n\n .submenu-popup li a {\n color: #fff;\n text-decoration: none;\n display: flex;\n flex-direction: row;\n align-items: center;\n gap: 12px;\n transition: background 0.2s;\n padding: 12px 16px;\n }\n\n .submenu-popup li a:hover {\n background: #333;\n }\n\n .submenu-popup li a md-icon {\n --md-icon-size: 20px;\n color: rgba(255, 255, 255, 0.8);\n }\n\n .submenu-popup li a[active] md-icon {\n color: var(--menu-tools-active-color);\n }\n .submenu-popup li {\n position: relative;\n }\n .subsubmenu {\n margin-left: 20px;\n margin-top: 8px;\n border-left: 2px solid rgba(255, 255, 255, 0.2);\n padding-left: 12px;\n }\n .subsubmenu li {\n padding: 8px 16px;\n font-size: 0.9em;\n }\n .subsubmenu li a {\n padding: 8px 12px;\n font-size: 0.85em;\n opacity: 0.8;\n }\n .subsubmenu li a:hover {\n opacity: 1;\n background: rgba(255, 255, 255, 0.1);\n }\n .subsubmenu li a[active] {\n opacity: 1;\n color: var(--menu-tools-active-color);\n background: rgba(107, 178, 249, 0.2);\n }\n .subsubmenu li a md-icon {\n --md-icon-size: 16px;\n }\n .expand-button {\n margin-left: auto;\n background: none;\n border: none;\n color: rgba(255, 255, 255, 0.6);\n cursor: pointer;\n padding: 4px;\n border-radius: 4px;\n transition: all 0.2s;\n }\n .expand-button:hover {\n color: rgba(255, 255, 255, 0.9);\n background: rgba(255, 255, 255, 0.1);\n }\n .expand-button md-icon {\n --md-icon-size: 16px;\n transition: transform 0.2s;\n }\n .expand-button.expanded md-icon {\n transform: rotate(90deg);\n }\n `\n ]\n\n @property({ type: String }) page?: string\n @property({ type: String, reflect: true }) width?: string\n\n @state() dataSets: any[] = []\n @state() menus: {\n name: string\n path: string\n icon: string\n active?: ({ path }: { path: string }) => boolean\n submenus?: {\n name: string\n path: string\n icon?: string\n active?: ({ path }: { path: string }) => boolean\n subsubmenus?: { name: string; path: string; icon?: string; active?: ({ path }: { path: string }) => boolean }[]\n }[]\n }[] = this.getMenus()\n\n private getMenus(): {\n name: string\n path: string\n icon: string\n active?: ({ path }: { path: string }) => boolean\n submenus?: {\n name: string\n path: string\n icon?: string\n active?: ({ path }: { path: string }) => boolean\n subsubmenus?: { name: string; path: string; icon?: string; active?: ({ path }: { path: string }) => boolean }[]\n }[]\n }[] {\n const dataSets = this.dataSets\n const isProjectDomain = isProjectTypeDomain()\n\n // 일반(=비-project) 도메인의 home: 프로젝트 목록 중심\n const generalHomeMenu = {\n name: '홈',\n path: 'project-list',\n icon: 'location_city',\n active: ({ path }: { path: string }) => /^project/.test(path),\n submenus: [\n { name: 'KPI 대시보드', path: 'kpi-dashboard-map', icon: 'dashboard' },\n { name: '프로젝트 목록', path: 'project-list', icon: 'autoplay' },\n { name: '완료 프로젝트 목록', path: 'project-completed-list', icon: 'stop_circle' }\n ]\n }\n\n // PROJECT 도메인의 home: 단일 프로젝트의 KPI 대시보드 + 프로젝트 수정 + 완공처리\n const projectHomeMenu = {\n name: '프로젝트',\n path: 'project-overview',\n icon: 'apartment',\n active: ({ path }: { path: string }) => /^(kpi-overview|project-detail|project-complete)/.test(path),\n submenus: [\n { name: '프로젝트 대시보드', path: 'project-detail', icon: 'dashboard' },\n { name: '프로젝트 수정', path: 'project-update', icon: 'edit_note' },\n { name: 'KPI 데이타입력', path: 'project-complete', icon: 'edit_note' }\n ]\n }\n\n return [\n isProjectDomain ? projectHomeMenu : generalHomeMenu,\n {\n name: 'KPI',\n path: 'kpi-overview',\n icon: 'bar_chart',\n submenus: [\n { name: 'KPI 개요', path: 'kpi-overview', icon: 'widget_small' },\n (!isProjectDomain && { name: 'KPI 목록', path: 'kpi-list', icon: 'readiness_score' }) || null,\n (!isProjectDomain && { name: 'KPI 값 목록', path: 'kpi-value-list', icon: 'heap_snapshot_multiple' }) || null,\n (!isProjectDomain && { name: 'KPI 메트릭 목록', path: 'kpi-metric-list', icon: 'data_exploration' }) || null,\n (!isProjectDomain && { name: 'KPI 메트릭 값 목록', path: 'kpi-metric-value-list', icon: 'heap_snapshot_multiple' }) ||\n null,\n // { name: 'KPI 매트릭 값 수동 입력', path: 'kpi-metric-value-manual-entry', icon: 'edit' },\n { name: 'KPI 시스템 가이드', path: 'kpi-system-guide', icon: 'menu_book' }\n ].filter(Boolean) as { name: string; path: string; icon: string }[]\n },\n // {\n // name: 'Data Set',\n // path: 'data-set-list',\n // icon: 'dataset',\n // submenus: [\n // { name: 'Data Set 목록', path: 'data-set-list', icon: 'dataset' },\n // { name: 'Data Key 목록', path: 'data-key-set-list', icon: 'key' },\n // { name: 'Data Sample 값 수동 입력', path: 'data-entry-list', icon: 'edit' },\n // {\n // name: 'Data Sample 목록',\n // path: 'data-sample-list',\n // icon: 'rule',\n // subsubmenus:\n // dataSets.map(item => {\n // return {\n // name: item.name,\n // icon: 'checklist_rtl',\n // path: `data-sample-search/${item.id}`\n // }\n // }) || []\n // },\n // {\n // name: 'Data Summary 목록',\n // path: 'data-summary-list',\n // icon: 'functions',\n // subsubmenus:\n // dataSets\n // .filter(item => item.active && item.summaryPeriod)\n // .map(item => {\n // return {\n // name: item.name,\n // icon: 'checklist',\n // path: `data-summary-period/${item.id}`\n // }\n // }) || []\n // }\n // ]\n // },\n {\n name: '시스템연계',\n path: 'project-task-list',\n icon: 'hub',\n submenus: [\n { name: '연계 현황', path: 'integration-monitor', icon: 'hub' },\n { name: '연계 설정', path: 'connection', icon: 'settings' },\n { name: '연계 시나리오', path: 'scenario', icon: 'hub' }\n ]\n },\n {\n name: '셋팅',\n path: 'users',\n icon: 'settings',\n submenus: [\n { name: '사용자 관리', path: 'users', icon: 'people' },\n { name: '환경 설정', path: 'setting', icon: 'settings' }\n ]\n }\n ]\n }\n\n @property({ type: Number }) openedMenuIndex: number | null = null\n @property({ type: Number }) openedSubmenuIndex: number | null = null\n @query('ul') menuUl!: HTMLUListElement\n @property({ type: Number }) submenuHeight: number | null = null\n\n render() {\n var page = this.page || ''\n return html`\n <ul>\n ${this.menus.map(\n (menu, i) => html`\n <li\n @click=${(e: Event) => {\n e.stopPropagation()\n this.openedMenuIndex = i\n this._setSubmenuHeight()\n }}\n >\n <a href=\"javascript:void(0)\" ?active=${this._isActiveMenu(page, menu)}>\n <md-icon>${menu.icon}</md-icon>\n <div>${menu.name}</div>\n </a>\n </li>\n `\n )}\n </ul>\n ${this.openedMenuIndex !== null\n ? html`\n <div class=\"submenu-popup\">\n <ul>\n ${this.menus[this.openedMenuIndex].submenus?.map(\n (sub, subIndex) => html`\n <li>\n <a\n href=${sub.subsubmenus ? 'javascript:void(0)' : sub.path}\n ?active=${this._isActiveSubmenu(page, sub)}\n @click=${sub.subsubmenus ? (e: Event) => e.preventDefault() : undefined}\n >\n ${sub.icon ? html`<md-icon>${sub.icon}</md-icon>` : ''} ${sub.name}\n ${sub.subsubmenus\n ? html`\n <button\n class=\"expand-button ${this.openedSubmenuIndex === subIndex ? 'expanded' : ''}\"\n @click=${(e: Event) => this._toggleSubsubmenu(e, subIndex)}\n >\n <md-icon>chevron_right</md-icon>\n </button>\n `\n : ''}\n </a>\n ${sub.subsubmenus && this.openedSubmenuIndex === subIndex\n ? html`\n <ul class=\"subsubmenu\">\n ${sub.subsubmenus.map(\n subsub => html`\n <li>\n <a href=${subsub.path} ?active=${this._isActiveSubsubmenu(page, subsub.path)}>\n ${subsub.icon ? html`<md-icon>${subsub.icon}</md-icon>` : ''} ${subsub.name}\n </a>\n </li>\n `\n )}\n </ul>\n `\n : ''}\n </li>\n `\n )}\n </ul>\n </div>\n `\n : ''}\n `\n }\n\n private _isActiveMenu(currentPage: string, menu: any): boolean {\n // 메인 메뉴의 기본 path 매칭 확인\n if (currentPage === menu.path) return true\n\n // 커스텀 active 함수가 있으면 추가로 확인\n if (menu.active && typeof menu.active === 'function') {\n if (menu.active({ path: currentPage })) return true\n }\n\n // 서브메뉴 중 하나라도 active인지 확인\n if (menu.submenus) {\n return menu.submenus.some((sub: any) => {\n // 서브메뉴 기본 path 매칭\n if (currentPage === sub.path || currentPage.startsWith(sub.path + '/')) return true\n\n // 서브메뉴에 커스텀 active 함수가 있으면 추가로 확인\n if (sub.active && typeof sub.active === 'function') {\n return sub.active({ path: currentPage })\n }\n\n return false\n })\n }\n\n return false\n }\n\n private _isActiveSubmenu(currentPage: string, submenu: any): boolean {\n // 기본 path 매칭 확인\n if (currentPage === submenu.path || currentPage.startsWith(submenu.path + '/')) return true\n\n // 커스텀 active 함수가 있으면 추가로 확인\n if (submenu.active && typeof submenu.active === 'function') {\n return submenu.active({ path: currentPage })\n }\n\n return false\n }\n\n async firstUpdated() {\n this._setSubmenuHeight()\n\n this.dataSets = await queryDataSets()\n this.menus = this.getMenus()\n }\n\n updated(changedProps: Map<string, any>) {\n if (changedProps.has('openedMenuIndex')) {\n this._setSubmenuHeight()\n }\n }\n\n _setSubmenuHeight() {\n if (this.menuUl) {\n this.submenuHeight = this.menuUl.clientHeight\n }\n }\n\n connectedCallback() {\n super.connectedCallback()\n // capture 단계로 등록 — 헤더 프로젝트 셀렉터(domain-switch)처럼 트리거에서\n // stopPropagation 하는 다른 컴포넌트의 클릭도 놓치지 않고 감지해 서브메뉴를 닫는다.\n // (버블 단계면 stopPropagation 에 막혀 셀렉터를 열어도 서브메뉴가 닫히지 않음)\n window.addEventListener('click', this._closeSubmenu, true)\n }\n\n disconnectedCallback() {\n window.removeEventListener('click', this._closeSubmenu, true)\n super.disconnectedCallback()\n }\n\n private _closeSubmenu = (e: MouseEvent) => {\n const path = e.composedPath()\n // 메뉴 영역 내부 클릭(메인메뉴 선택·서브서브메뉴 토글)은 닫지 않는다.\n // capture 단계라 내부 핸들러보다 먼저 발화하므로 composedPath 로 직접 판별.\n if (path.includes(this)) {\n // 단, 내부라도 실제 페이지로 이동하는 링크 클릭이면 기존대로 닫는다.\n const isNavLink = path.some(\n el =>\n el instanceof HTMLAnchorElement &&\n !!el.getAttribute('href') &&\n el.getAttribute('href') !== 'javascript:void(0)'\n )\n if (!isNavLink) return\n }\n this.openedMenuIndex = null\n }\n\n private _toggleSubsubmenu(e: Event, subIndex: number) {\n e.stopPropagation()\n if (this.openedSubmenuIndex === subIndex) {\n this.openedSubmenuIndex = null\n } else {\n this.openedSubmenuIndex = subIndex\n }\n }\n\n private _isActiveSubsubmenu(currentPage: string, subsubmenu: any): boolean {\n // 기본 path 매칭 확인\n if (currentPage === subsubmenu.path || currentPage.startsWith(subsubmenu.path + '/')) return true\n\n // 커스텀 active 함수가 있으면 추가로 확인\n if (subsubmenu.active && typeof subsubmenu.active === 'function') {\n return subsubmenu.active({ path: currentPage })\n }\n\n return false\n }\n\n stateChanged(state: any) {\n this.page = state.route.page\n this.width = state.layout.width\n }\n}\n"]}
|
|
@@ -29,10 +29,10 @@ let KpiStatQuery = class KpiStatQuery {
|
|
|
29
29
|
.andWhere('kv.domain_id IN (:...domainIds)', { domainIds: await (0, domain_inheritance_js_1.getDomainIdsWithAncestors)(domain) });
|
|
30
30
|
// 기간 필터
|
|
31
31
|
if (startYearMonth && startYearMonth.trim() !== '') {
|
|
32
|
-
queryBuilder.andWhere(`
|
|
32
|
+
queryBuilder.andWhere(`LEFT(kv.value_date, 7) >= :startYearMonth`, { startYearMonth });
|
|
33
33
|
}
|
|
34
34
|
if (endYearMonth && endYearMonth.trim() !== '') {
|
|
35
|
-
queryBuilder.andWhere(`
|
|
35
|
+
queryBuilder.andWhere(`LEFT(kv.value_date, 7) <= :endYearMonth`, { endYearMonth });
|
|
36
36
|
}
|
|
37
37
|
if (sectorType === null || sectorType === void 0 ? void 0 : sectorType.trim()) {
|
|
38
38
|
queryBuilder.andWhere('p.sector_type = :sectorType', { sectorType });
|
|
@@ -84,10 +84,10 @@ let KpiStatQuery = class KpiStatQuery {
|
|
|
84
84
|
.andWhere('kv.domain_id IN (:...domainIds)', { domainIds: await (0, domain_inheritance_js_1.getDomainIdsWithAncestors)(domain) });
|
|
85
85
|
// 기간 필터
|
|
86
86
|
if (startYearMonth && startYearMonth.trim() !== '') {
|
|
87
|
-
queryBuilder.andWhere(`
|
|
87
|
+
queryBuilder.andWhere(`LEFT(kv.value_date, 7) >= :startYearMonth`, { startYearMonth });
|
|
88
88
|
}
|
|
89
89
|
if (endYearMonth && endYearMonth.trim() !== '') {
|
|
90
|
-
queryBuilder.andWhere(`
|
|
90
|
+
queryBuilder.andWhere(`LEFT(kv.value_date, 7) <= :endYearMonth`, { endYearMonth });
|
|
91
91
|
}
|
|
92
92
|
if (sectorType === null || sectorType === void 0 ? void 0 : sectorType.trim()) {
|
|
93
93
|
queryBuilder.andWhere('p.sector_type = :sectorType', { sectorType });
|
|
@@ -157,10 +157,10 @@ let KpiStatQuery = class KpiStatQuery {
|
|
|
157
157
|
.andWhere('kv.domain_id IN (:...domainIds)', { domainIds: await (0, domain_inheritance_js_1.getDomainIdsWithAncestors)(domain) });
|
|
158
158
|
// 기간 필터
|
|
159
159
|
if (startYearMonth && startYearMonth.trim() !== '') {
|
|
160
|
-
queryBuilder.andWhere(`
|
|
160
|
+
queryBuilder.andWhere(`LEFT(kv.value_date, 7) >= :startYearMonth`, { startYearMonth });
|
|
161
161
|
}
|
|
162
162
|
if (endYearMonth && endYearMonth.trim() !== '') {
|
|
163
|
-
queryBuilder.andWhere(`
|
|
163
|
+
queryBuilder.andWhere(`LEFT(kv.value_date, 7) <= :endYearMonth`, { endYearMonth });
|
|
164
164
|
}
|
|
165
165
|
if (sectorType === null || sectorType === void 0 ? void 0 : sectorType.trim()) {
|
|
166
166
|
queryBuilder.andWhere('p.sector_type = :sectorType', { sectorType });
|
|
@@ -278,21 +278,22 @@ let KpiStatQuery = class KpiStatQuery {
|
|
|
278
278
|
WHEN p.geo_group IN ('50','51','52','53') THEN '경상남도'
|
|
279
279
|
WHEN p.geo_group = '63' THEN '제주특별자치도'
|
|
280
280
|
END as geoGroup`,
|
|
281
|
-
|
|
281
|
+
// 월 기준 = KPI 측정월(kv.value_date, 'YYYY-MM-DD' 문자열) — 프로젝트 준공월(p.end_date) 아님.
|
|
282
|
+
`LEFT(kv.value_date, 7) as yearMonth`,
|
|
282
283
|
'AVG(kv.score) as avgVal',
|
|
283
284
|
'COUNT(DISTINCT p.id) as projectCount'
|
|
284
285
|
])
|
|
285
286
|
.innerJoin('kpis', 'k', 'kv.kpi_id = k.id')
|
|
286
287
|
.innerJoin('projects', 'p', 'kv.kpi_org_scope_id = p.id')
|
|
287
|
-
.where('
|
|
288
|
+
.where('kv.value_date IS NOT NULL')
|
|
288
289
|
.andWhere('p.geo_group IS NOT NULL')
|
|
289
290
|
.andWhere('kv.domain_id IN (:...domainIds)', { domainIds: await (0, domain_inheritance_js_1.getDomainIdsWithAncestors)(domain) });
|
|
290
|
-
// 기간 필터
|
|
291
|
+
// 기간 필터 — KPI 측정월(kv.value_date) 기준
|
|
291
292
|
if (startYearMonth && startYearMonth.trim() !== '') {
|
|
292
|
-
queryBuilder.andWhere(`
|
|
293
|
+
queryBuilder.andWhere(`LEFT(kv.value_date, 7) >= :startYearMonth`, { startYearMonth });
|
|
293
294
|
}
|
|
294
295
|
if (endYearMonth && endYearMonth.trim() !== '') {
|
|
295
|
-
queryBuilder.andWhere(`
|
|
296
|
+
queryBuilder.andWhere(`LEFT(kv.value_date, 7) <= :endYearMonth`, { endYearMonth });
|
|
296
297
|
}
|
|
297
298
|
if (sectorType === null || sectorType === void 0 ? void 0 : sectorType.trim()) {
|
|
298
299
|
queryBuilder.andWhere('p.sector_type = :sectorType', { sectorType });
|
|
@@ -353,10 +354,10 @@ let KpiStatQuery = class KpiStatQuery {
|
|
|
353
354
|
qb.andWhere('k.name LIKE :kpiNamePattern', { kpiNamePattern: `${kpiNamePattern}%` });
|
|
354
355
|
}
|
|
355
356
|
if (startYearMonth === null || startYearMonth === void 0 ? void 0 : startYearMonth.trim()) {
|
|
356
|
-
qb.andWhere(`
|
|
357
|
+
qb.andWhere(`LEFT(kv.value_date, 7) >= :startYearMonth`, { startYearMonth });
|
|
357
358
|
}
|
|
358
359
|
if (endYearMonth === null || endYearMonth === void 0 ? void 0 : endYearMonth.trim()) {
|
|
359
|
-
qb.andWhere(`
|
|
360
|
+
qb.andWhere(`LEFT(kv.value_date, 7) <= :endYearMonth`, { endYearMonth });
|
|
360
361
|
}
|
|
361
362
|
qb.groupBy('k.name, pk.name').orderBy('k.name', 'ASC');
|
|
362
363
|
const results = await qb.getRawMany();
|
|
@@ -394,10 +395,10 @@ let KpiStatQuery = class KpiStatQuery {
|
|
|
394
395
|
.andWhere('p.geo_group IS NOT NULL')
|
|
395
396
|
.andWhere('kv.domain_id IN (:...domainIds)', { domainIds: await (0, domain_inheritance_js_1.getDomainIdsWithAncestors)(domain) });
|
|
396
397
|
if (startYearMonth === null || startYearMonth === void 0 ? void 0 : startYearMonth.trim()) {
|
|
397
|
-
queryBuilder.andWhere(`
|
|
398
|
+
queryBuilder.andWhere(`LEFT(kv.value_date, 7) >= :startYearMonth`, { startYearMonth });
|
|
398
399
|
}
|
|
399
400
|
if (endYearMonth === null || endYearMonth === void 0 ? void 0 : endYearMonth.trim()) {
|
|
400
|
-
queryBuilder.andWhere(`
|
|
401
|
+
queryBuilder.andWhere(`LEFT(kv.value_date, 7) <= :endYearMonth`, { endYearMonth });
|
|
401
402
|
}
|
|
402
403
|
if (sectorType === null || sectorType === void 0 ? void 0 : sectorType.trim()) {
|
|
403
404
|
queryBuilder.andWhere('p.sector_type = :sectorType', { sectorType });
|
|
@@ -449,10 +450,10 @@ let KpiStatQuery = class KpiStatQuery {
|
|
|
449
450
|
.andWhere('p.geo_group = :geoGroup', { geoGroup })
|
|
450
451
|
.andWhere('kv.domain_id IN (:...domainIds)', { domainIds: await (0, domain_inheritance_js_1.getDomainIdsWithAncestors)(domain) });
|
|
451
452
|
if (startYearMonth === null || startYearMonth === void 0 ? void 0 : startYearMonth.trim()) {
|
|
452
|
-
queryBuilder.andWhere(`
|
|
453
|
+
queryBuilder.andWhere(`LEFT(kv.value_date, 7) >= :startYearMonth`, { startYearMonth });
|
|
453
454
|
}
|
|
454
455
|
if (endYearMonth === null || endYearMonth === void 0 ? void 0 : endYearMonth.trim()) {
|
|
455
|
-
queryBuilder.andWhere(`
|
|
456
|
+
queryBuilder.andWhere(`LEFT(kv.value_date, 7) <= :endYearMonth`, { endYearMonth });
|
|
456
457
|
}
|
|
457
458
|
queryBuilder.groupBy('k.name').orderBy('k.name', 'ASC');
|
|
458
459
|
const results = await queryBuilder.getRawMany();
|
|
@@ -494,10 +495,10 @@ let KpiStatQuery = class KpiStatQuery {
|
|
|
494
495
|
.andWhere('kv.domain_id IN (:...domainIds)', { domainIds: await (0, domain_inheritance_js_1.getDomainIdsWithAncestors)(domain) });
|
|
495
496
|
// 기간 필터
|
|
496
497
|
if (startYearMonth && startYearMonth.trim() !== '') {
|
|
497
|
-
queryBuilder.andWhere(`
|
|
498
|
+
queryBuilder.andWhere(`LEFT(kv.value_date, 7) >= :startYearMonth`, { startYearMonth });
|
|
498
499
|
}
|
|
499
500
|
if (endYearMonth && endYearMonth.trim() !== '') {
|
|
500
|
-
queryBuilder.andWhere(`
|
|
501
|
+
queryBuilder.andWhere(`LEFT(kv.value_date, 7) <= :endYearMonth`, { endYearMonth });
|
|
501
502
|
}
|
|
502
503
|
queryBuilder
|
|
503
504
|
.andWhere(`CASE
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"kpi-stat-query.js","sourceRoot":"","sources":["../../../server/service/kpi-stat/kpi-stat-query.ts"],"names":[],"mappings":"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","sourcesContent":["import { Resolver, Query, Arg, Ctx, Directive } from 'type-graphql'\nimport { getRepository } from '@things-factory/shell'\nimport type ResolverContext from '@things-factory/auth-base'\nimport { KpiStatistic } from '@things-factory/kpi'\nimport { getDomainIdsWithAncestors } from '@things-factory/kpi/dist-server/service/utils/domain-inheritance.js'\nimport { KpiComprehensiveStats, KpiComprehensiveStatsByGeoGroup, KpiMonthlyTrend, KpiProjectStat } from './kpi-stat-types'\n\n@Resolver(KpiStatistic)\nexport class KpiStatQuery {\n @Directive('@privilege(category: \"kpi\", privilege: \"read\", domainOwnerGranted: true, superUserGranted: true)')\n @Query(() => [KpiComprehensiveStats], { description: 'Get KPI box plot statistics for Z-category KPIs for all projects' })\n async totalKpiZValueComprehensiveStats(\n @Arg('startYearMonth', { nullable: true }) startYearMonth?: string,\n @Arg('endYearMonth', { nullable: true }) endYearMonth?: string,\n @Arg('sectorType', { nullable: true }) sectorType?: string,\n @Arg('buildingUsage', { nullable: true }) buildingUsage?: string,\n @Ctx() context?: ResolverContext\n ): Promise<KpiComprehensiveStats[]> {\n const { domain } = context.state\n\n const queryBuilder = getRepository('kpi_values')\n .createQueryBuilder('kv')\n .select([\n 'k.name as kpiName',\n 'MIN(kv.score) as minVal',\n 'PERCENTILE_CONT(0.25) WITHIN GROUP (ORDER BY kv.score) as q1Val',\n 'PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY kv.score) as medVal',\n 'PERCENTILE_CONT(0.75) WITHIN GROUP (ORDER BY kv.score) as q3Val',\n 'AVG(kv.score) as avgVal',\n 'MAX(kv.score) as maxVal',\n 'COUNT(DISTINCT p.id) as projectCount'\n ])\n .innerJoin('kpis', 'k', 'kv.kpi_id = k.id')\n .innerJoin('projects', 'p', 'kv.kpi_org_scope_id = p.id')\n .where('k.name LIKE :pattern', { pattern: 'Z%' })\n .andWhere('p.end_date IS NOT NULL')\n .andWhere('kv.domain_id IN (:...domainIds)', { domainIds: await getDomainIdsWithAncestors(domain) })\n\n // 기간 필터\n if (startYearMonth && startYearMonth.trim() !== '') {\n queryBuilder.andWhere(`TO_CHAR(p.end_date, 'YYYY-MM') >= :startYearMonth`, { startYearMonth })\n }\n if (endYearMonth && endYearMonth.trim() !== '') {\n queryBuilder.andWhere(`TO_CHAR(p.end_date, 'YYYY-MM') <= :endYearMonth`, { endYearMonth })\n }\n if (sectorType?.trim()) {\n queryBuilder.andWhere('p.sector_type = :sectorType', { sectorType })\n }\n if (buildingUsage?.trim()) {\n queryBuilder.andWhere('p.building_usage = :buildingUsage', { buildingUsage })\n }\n\n queryBuilder.groupBy('k.name')\n\n const results = await queryBuilder.getRawMany()\n\n return results.map(result => {\n const kpiName = result.kpiname\n const minVal = Math.min(Math.max(Number(result.minval), 0), 1)\n const q1Val = Math.min(Math.max(Number(result.q1val), 0), 1)\n const medVal = Math.min(Math.max(Number(result.medval), 0), 1)\n const q3Val = Math.min(Math.max(Number(result.q3val), 0), 1)\n const avgVal = Math.min(Math.max(Number(result.avgval), 0), 1)\n const maxVal = Math.min(Math.max(Number(result.maxval), 0), 1)\n const projectCount = Number(result.projectcount)\n\n return {\n kpiName: kpiName,\n minVal: isNaN(minVal) ? 0 : minVal,\n q1Val: isNaN(q1Val) ? 0 : q1Val,\n medVal: isNaN(medVal) ? 0 : medVal,\n q3Val: isNaN(q3Val) ? 0 : q3Val,\n maxVal: isNaN(maxVal) ? 0 : maxVal,\n avgVal: isNaN(avgVal) ? 0 : avgVal,\n projectCount: isNaN(projectCount) ? 0 : projectCount\n }\n })\n }\n\n @Directive('@privilege(category: \"kpi\", privilege: \"read\", domainOwnerGranted: true, superUserGranted: true)')\n @Query(() => [KpiComprehensiveStats], { description: 'Get KPI box plot statistics for Y-category KPIs for all projects' })\n async totalKpiYValueComprehensiveStats(\n @Arg('startYearMonth', { nullable: true }) startYearMonth?: string,\n @Arg('endYearMonth', { nullable: true }) endYearMonth?: string,\n @Arg('sectorType', { nullable: true }) sectorType?: string,\n @Arg('buildingUsage', { nullable: true }) buildingUsage?: string,\n @Ctx() context?: ResolverContext\n ): Promise<KpiComprehensiveStats[]> {\n const { domain } = context.state\n\n const queryBuilder = getRepository('kpi_values')\n .createQueryBuilder('kv')\n .select([\n 'k.name as kpiName',\n 'MIN(kv.score) as minVal',\n 'PERCENTILE_CONT(0.25) WITHIN GROUP (ORDER BY kv.score) as q1Val',\n 'PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY kv.score) as medVal',\n 'PERCENTILE_CONT(0.75) WITHIN GROUP (ORDER BY kv.score) as q3Val',\n 'AVG(kv.score) as avgVal',\n 'MAX(kv.score) as maxVal',\n 'COUNT(DISTINCT p.id) as projectCount'\n ])\n .innerJoin('kpis', 'k', 'kv.kpi_id = k.id')\n .innerJoin('projects', 'p', 'kv.kpi_org_scope_id = p.id')\n .where('k.name LIKE :pattern', { pattern: 'Y%' })\n .andWhere('p.end_date IS NOT NULL')\n .andWhere('kv.domain_id IN (:...domainIds)', { domainIds: await getDomainIdsWithAncestors(domain) })\n\n // 기간 필터\n if (startYearMonth && startYearMonth.trim() !== '') {\n queryBuilder.andWhere(`TO_CHAR(p.end_date, 'YYYY-MM') >= :startYearMonth`, { startYearMonth })\n }\n if (endYearMonth && endYearMonth.trim() !== '') {\n queryBuilder.andWhere(`TO_CHAR(p.end_date, 'YYYY-MM') <= :endYearMonth`, { endYearMonth })\n }\n if (sectorType?.trim()) {\n queryBuilder.andWhere('p.sector_type = :sectorType', { sectorType })\n }\n if (buildingUsage?.trim()) {\n queryBuilder.andWhere('p.building_usage = :buildingUsage', { buildingUsage })\n }\n\n queryBuilder.groupBy('k.name').orderBy('k.name', 'ASC')\n\n const results = await queryBuilder.getRawMany()\n\n return results.map(result => {\n const kpiName = result.kpiname\n const minVal = Math.min(Math.max(Number(result.minval), 0), 1)\n const q1Val = Math.min(Math.max(Number(result.q1val), 0), 1)\n const medVal = Math.min(Math.max(Number(result.medval), 0), 1)\n const q3Val = Math.min(Math.max(Number(result.q3val), 0), 1)\n const avgVal = Math.min(Math.max(Number(result.avgval), 0), 1)\n const maxVal = Math.min(Math.max(Number(result.maxval), 0), 1)\n const projectCount = Number(result.projectcount)\n\n return {\n kpiName: kpiName,\n minVal: isNaN(minVal) ? 0 : minVal,\n q1Val: isNaN(q1Val) ? 0 : q1Val,\n medVal: isNaN(medVal) ? 0 : medVal,\n q3Val: isNaN(q3Val) ? 0 : q3Val,\n maxVal: isNaN(maxVal) ? 0 : maxVal,\n avgVal: isNaN(avgVal) ? 0 : avgVal,\n projectCount: isNaN(projectCount) ? 0 : projectCount\n }\n })\n }\n\n @Directive('@privilege(category: \"kpi\", privilege: \"read\", domainOwnerGranted: true, superUserGranted: true)')\n @Query(() => [KpiComprehensiveStatsByGeoGroup], {\n description: 'Get KPI box plot statistics for Z-category KPIs by metro area'\n })\n async kpiZValueComprehensiveStatsByGeoGroup(\n @Arg('geoGroup', { nullable: true }) geoGroup?: string,\n @Arg('kpiName', { nullable: true }) kpiName?: string,\n @Arg('startYearMonth', { nullable: true }) startYearMonth?: string,\n @Arg('endYearMonth', { nullable: true }) endYearMonth?: string,\n @Arg('sectorType', { nullable: true }) sectorType?: string,\n @Arg('buildingUsage', { nullable: true }) buildingUsage?: string,\n @Ctx() context?: ResolverContext\n ): Promise<KpiComprehensiveStatsByGeoGroup[]> {\n const { domain } = context.state\n\n const queryBuilder = getRepository('kpi_values')\n .createQueryBuilder('kv')\n .select([\n `CASE\n WHEN p.geo_group IN ('01','02','03','04','05','06','07','08') THEN '서울특별시'\n WHEN p.geo_group IN ('46','47','48','49') THEN '부산광역시'\n WHEN p.geo_group IN ('41','42','43') THEN '대구광역시'\n WHEN p.geo_group IN ('21','22','23') THEN '인천광역시'\n WHEN p.geo_group IN ('61','62') THEN '광주광역시'\n WHEN p.geo_group IN ('34','35') THEN '대전광역시'\n WHEN p.geo_group IN ('44','45') THEN '울산광역시'\n WHEN p.geo_group = '30' THEN '세종특별자치시'\n WHEN p.geo_group IN ('10','11','12','13','14','15','16','17','18') THEN '경기도'\n WHEN p.geo_group IN ('24','25','26','33') THEN '강원도'\n WHEN p.geo_group IN ('27','28','29') THEN '충청북도'\n WHEN p.geo_group IN ('31','32') THEN '충청남도'\n WHEN p.geo_group IN ('54','55','56') THEN '전라북도'\n WHEN p.geo_group IN ('57','58','59') THEN '전라남도'\n WHEN p.geo_group IN ('36','37','38','39','40') THEN '경상북도'\n WHEN p.geo_group IN ('50','51','52','53') THEN '경상남도'\n WHEN p.geo_group = '63' THEN '제주특별자치도'\n END as geoGroup`,\n 'MIN(kv.score) as minVal',\n 'PERCENTILE_CONT(0.25) WITHIN GROUP (ORDER BY kv.score) as q1Val',\n 'PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY kv.score) as medVal',\n 'PERCENTILE_CONT(0.75) WITHIN GROUP (ORDER BY kv.score) as q3Val',\n 'MAX(kv.score) as maxVal',\n 'AVG(kv.score) as avgVal',\n 'COUNT(DISTINCT p.id) as projectCount'\n ])\n .innerJoin('kpis', 'k', 'kv.kpi_id = k.id')\n .innerJoin('projects', 'p', 'kv.kpi_org_scope_id = p.id')\n .where('p.end_date IS NOT NULL')\n .andWhere('p.geo_group IS NOT NULL')\n .andWhere('kv.domain_id IN (:...domainIds)', { domainIds: await getDomainIdsWithAncestors(domain) })\n\n // 기간 필터\n if (startYearMonth && startYearMonth.trim() !== '') {\n queryBuilder.andWhere(`TO_CHAR(p.end_date, 'YYYY-MM') >= :startYearMonth`, { startYearMonth })\n }\n if (endYearMonth && endYearMonth.trim() !== '') {\n queryBuilder.andWhere(`TO_CHAR(p.end_date, 'YYYY-MM') <= :endYearMonth`, { endYearMonth })\n }\n if (sectorType?.trim()) {\n queryBuilder.andWhere('p.sector_type = :sectorType', { sectorType })\n }\n if (buildingUsage?.trim()) {\n queryBuilder.andWhere('p.building_usage = :buildingUsage', { buildingUsage })\n }\n\n // KPI 필터: kpiName이 지정되면 해당 Y-level KPI만, 없으면 Z-level KPI 전체\n if (kpiName && kpiName.trim() !== '') {\n queryBuilder.andWhere('k.name = :kpiName', { kpiName })\n } else {\n queryBuilder.andWhere('k.name LIKE :pattern', { pattern: 'Z%' })\n }\n\n queryBuilder.groupBy('geoGroup')\n\n if (geoGroup && geoGroup.trim() !== '') {\n queryBuilder.having('geoGroup = :geoGroup', { geoGroup })\n }\n\n const results = await queryBuilder.getRawMany()\n return results\n .map(result => {\n const kpiName = result.kpiname\n const minVal = Math.min(Math.max(Number(result.minval), 0), 1)\n const q1Val = Math.min(Math.max(Number(result.q1val), 0), 1)\n const medVal = Math.min(Math.max(Number(result.medval), 0), 1)\n const q3Val = Math.min(Math.max(Number(result.q3val), 0), 1)\n const maxVal = Math.min(Math.max(Number(result.maxval), 0), 1)\n const avgVal = Math.min(Math.max(Number(result.avgval), 0), 1)\n const projectCount = Number(result.projectcount)\n\n return {\n kpiName: kpiName,\n geoGroup: result.geogroup || null,\n minVal: isNaN(minVal) ? 0 : minVal,\n q1Val: isNaN(q1Val) ? 0 : q1Val,\n medVal: isNaN(medVal) ? 0 : medVal,\n q3Val: isNaN(q3Val) ? 0 : q3Val,\n maxVal: isNaN(maxVal) ? 0 : maxVal,\n avgVal: isNaN(avgVal) ? 0 : avgVal,\n projectCount: isNaN(projectCount) ? 0 : projectCount\n }\n })\n .filter(result => result.geoGroup !== null)\n }\n\n @Directive('@privilege(category: \"kpi\", privilege: \"read\", domainOwnerGranted: true, superUserGranted: true)')\n @Query(() => [KpiComprehensiveStatsByGeoGroup], { description: 'Get KPI box plot statistics for Y-category KPIs by geo group' })\n async kpiYValueComprehensiveStatsByGeoGroup(\n @Arg('geoGroup', { nullable: true }) geoGroup?: string,\n @Ctx() context?: ResolverContext\n ): Promise<KpiComprehensiveStatsByGeoGroup[]> {\n const { domain } = context.state\n\n const queryBuilder = getRepository('kpi_values')\n .createQueryBuilder('kv')\n .select([\n 'p.geo_group as geoGroup',\n 'k.name as kpiName',\n 'MIN(kv.score) as minVal',\n 'PERCENTILE_CONT(0.25) WITHIN GROUP (ORDER BY kv.score) as q1Val',\n 'PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY kv.score) as medVal',\n 'PERCENTILE_CONT(0.75) WITHIN GROUP (ORDER BY kv.score) as q3Val',\n 'MAX(kv.score) as maxVal',\n 'AVG(kv.score) as avgVal',\n 'COUNT(DISTINCT p.id) as projectCount'\n ])\n .innerJoin('kpis', 'k', 'kv.kpi_id = k.id')\n .innerJoin('projects', 'p', 'kv.kpi_org_scope_id = p.id')\n .where('k.name LIKE :pattern', { pattern: 'Y%' })\n .andWhere('p.end_date IS NOT NULL')\n .andWhere('p.geo_group IS NOT NULL')\n .andWhere('kv.domain_id IN (:...domainIds)', { domainIds: await getDomainIdsWithAncestors(domain) })\n .groupBy('p.geo_group, k.name')\n\n if (geoGroup && geoGroup.trim() !== '') {\n queryBuilder.andWhere('p.geo_group LIKE :geoGroup', { geoGroup: `%${geoGroup}%` })\n }\n\n const results = await queryBuilder.getRawMany()\n return results\n .map(result => {\n const kpiName = result.kpiname\n const minVal = Math.min(Math.max(Number(result.minval), 0), 1)\n const q1Val = Math.min(Math.max(Number(result.q1val), 0), 1)\n const medVal = Math.min(Math.max(Number(result.medval), 0), 1)\n const q3Val = Math.min(Math.max(Number(result.q3val), 0), 1)\n const maxVal = Math.min(Math.max(Number(result.maxval), 0), 1)\n const avgVal = Math.min(Math.max(Number(result.avgval), 0), 1)\n const projectCount = Number(result.projectcount)\n\n return {\n kpiName: kpiName,\n geoGroup: result.geogroup || null,\n minVal: isNaN(minVal) ? 0 : minVal,\n q1Val: isNaN(q1Val) ? 0 : q1Val,\n medVal: isNaN(medVal) ? 0 : medVal,\n q3Val: isNaN(q3Val) ? 0 : q3Val,\n maxVal: isNaN(maxVal) ? 0 : maxVal,\n avgVal: isNaN(avgVal) ? 0 : avgVal,\n projectCount: isNaN(projectCount) ? 0 : projectCount\n }\n })\n .filter(result => result.geoGroup !== null)\n }\n\n @Directive('@privilege(category: \"kpi\", privilege: \"read\", domainOwnerGranted: true, superUserGranted: true)')\n @Query(() => [KpiMonthlyTrend], { description: 'Get monthly KPI trend for Z-category KPIs by metro area' })\n async kpiZValueMonthlyTrendByGeoGroup(\n @Arg('kpiName', { nullable: true }) kpiName?: string,\n @Arg('startYearMonth', { nullable: true }) startYearMonth?: string,\n @Arg('endYearMonth', { nullable: true }) endYearMonth?: string,\n @Arg('sectorType', { nullable: true }) sectorType?: string,\n @Arg('buildingUsage', { nullable: true }) buildingUsage?: string,\n @Ctx() context?: ResolverContext\n ): Promise<KpiMonthlyTrend[]> {\n const { domain } = context.state\n\n const queryBuilder = getRepository('kpi_values')\n .createQueryBuilder('kv')\n .select([\n `CASE\n WHEN p.geo_group IN ('01','02','03','04','05','06','07','08') THEN '서울특별시'\n WHEN p.geo_group IN ('46','47','48','49') THEN '부산광역시'\n WHEN p.geo_group IN ('41','42','43') THEN '대구광역시'\n WHEN p.geo_group IN ('21','22','23') THEN '인천광역시'\n WHEN p.geo_group IN ('61','62') THEN '광주광역시'\n WHEN p.geo_group IN ('34','35') THEN '대전광역시'\n WHEN p.geo_group IN ('44','45') THEN '울산광역시'\n WHEN p.geo_group = '30' THEN '세종특별자치시'\n WHEN p.geo_group IN ('10','11','12','13','14','15','16','17','18') THEN '경기도'\n WHEN p.geo_group IN ('24','25','26','33') THEN '강원도'\n WHEN p.geo_group IN ('27','28','29') THEN '충청북도'\n WHEN p.geo_group IN ('31','32') THEN '충청남도'\n WHEN p.geo_group IN ('54','55','56') THEN '전라북도'\n WHEN p.geo_group IN ('57','58','59') THEN '전라남도'\n WHEN p.geo_group IN ('36','37','38','39','40') THEN '경상북도'\n WHEN p.geo_group IN ('50','51','52','53') THEN '경상남도'\n WHEN p.geo_group = '63' THEN '제주특별자치도'\n END as geoGroup`,\n `TO_CHAR(p.end_date, 'YYYY-MM') as yearMonth`,\n 'AVG(kv.score) as avgVal',\n 'COUNT(DISTINCT p.id) as projectCount'\n ])\n .innerJoin('kpis', 'k', 'kv.kpi_id = k.id')\n .innerJoin('projects', 'p', 'kv.kpi_org_scope_id = p.id')\n .where('p.end_date IS NOT NULL')\n .andWhere('p.geo_group IS NOT NULL')\n .andWhere('kv.domain_id IN (:...domainIds)', { domainIds: await getDomainIdsWithAncestors(domain) })\n\n // 기간 필터\n if (startYearMonth && startYearMonth.trim() !== '') {\n queryBuilder.andWhere(`TO_CHAR(p.end_date, 'YYYY-MM') >= :startYearMonth`, { startYearMonth })\n }\n if (endYearMonth && endYearMonth.trim() !== '') {\n queryBuilder.andWhere(`TO_CHAR(p.end_date, 'YYYY-MM') <= :endYearMonth`, { endYearMonth })\n }\n if (sectorType?.trim()) {\n queryBuilder.andWhere('p.sector_type = :sectorType', { sectorType })\n }\n if (buildingUsage?.trim()) {\n queryBuilder.andWhere('p.building_usage = :buildingUsage', { buildingUsage })\n }\n\n // KPI 필터: kpiName이 지정되면 해당 Y-level KPI만, 없으면 Z-level KPI 전체\n if (kpiName && kpiName.trim() !== '') {\n queryBuilder.andWhere('k.name = :kpiName', { kpiName })\n } else {\n queryBuilder.andWhere('k.name LIKE :pattern', { pattern: 'Z%' })\n }\n\n queryBuilder.groupBy('geoGroup, yearMonth').orderBy('yearMonth', 'ASC')\n\n const results = await queryBuilder.getRawMany()\n return results\n .map(result => {\n const avgVal = Math.min(Math.max(Number(result.avgval), 0), 1)\n const projectCount = Number(result.projectcount)\n\n return {\n geoGroup: result.geogroup || null,\n yearMonth: result.yearmonth,\n avgVal: isNaN(avgVal) ? 0 : avgVal,\n projectCount: isNaN(projectCount) ? 0 : projectCount\n }\n })\n .filter(result => result.geoGroup !== null)\n }\n\n @Directive('@privilege(category: \"kpi\", privilege: \"read\", domainOwnerGranted: true, superUserGranted: true)')\n @Query(() => [KpiProjectStat], { description: 'Get KPI stats aggregated from project data with optional sectorType/buildingUsage filters' })\n async kpiProjectStats(\n @Arg('sectorType', { nullable: true }) sectorType?: string,\n @Arg('buildingUsage', { nullable: true }) buildingUsage?: string,\n @Arg('kpiNamePattern', { nullable: true }) kpiNamePattern?: string,\n @Arg('startYearMonth', { nullable: true }) startYearMonth?: string,\n @Arg('endYearMonth', { nullable: true }) endYearMonth?: string,\n @Ctx() context?: ResolverContext\n ): Promise<KpiProjectStat[]> {\n const { domain } = context.state\n\n const qb = getRepository('kpi_values')\n .createQueryBuilder('kv')\n .select([\n 'k.name as kpiName',\n 'pk.name as categoryName',\n 'MIN(kv.score) as minVal',\n 'PERCENTILE_CONT(0.25) WITHIN GROUP (ORDER BY kv.score) as q1Val',\n 'PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY kv.score) as medVal',\n 'PERCENTILE_CONT(0.75) WITHIN GROUP (ORDER BY kv.score) as q3Val',\n 'MAX(kv.score) as maxVal',\n 'AVG(kv.score) as avgVal',\n 'STDDEV_POP(kv.score) as stddevVal',\n 'COUNT(DISTINCT p.id) as projectCount'\n ])\n .innerJoin('kpis', 'k', 'kv.kpi_id = k.id')\n .leftJoin('kpis', 'pk', 'k.parent_id = pk.id')\n .innerJoin('projects', 'p', 'kv.kpi_org_scope_id = p.id')\n .where('p.end_date IS NOT NULL')\n .andWhere('kv.domain_id IN (:...domainIds)', { domainIds: await getDomainIdsWithAncestors(domain) })\n\n if (sectorType?.trim()) {\n qb.andWhere('p.sector_type = :sectorType', { sectorType })\n }\n if (buildingUsage?.trim()) {\n qb.andWhere('p.building_usage = :buildingUsage', { buildingUsage })\n }\n if (kpiNamePattern?.trim()) {\n qb.andWhere('k.name LIKE :kpiNamePattern', { kpiNamePattern: `${kpiNamePattern}%` })\n }\n if (startYearMonth?.trim()) {\n qb.andWhere(`TO_CHAR(p.end_date, 'YYYY-MM') >= :startYearMonth`, { startYearMonth })\n }\n if (endYearMonth?.trim()) {\n qb.andWhere(`TO_CHAR(p.end_date, 'YYYY-MM') <= :endYearMonth`, { endYearMonth })\n }\n\n qb.groupBy('k.name, pk.name').orderBy('k.name', 'ASC')\n\n const results = await qb.getRawMany()\n const clamp = (v: number) => Math.min(Math.max(isNaN(v) ? 0 : v, 0), 1)\n return results.map(r => ({\n kpiName: r.kpiname,\n categoryName: r.categoryname || undefined,\n minVal: clamp(Number(r.minval)),\n q1Val: clamp(Number(r.q1val)),\n medVal: clamp(Number(r.medval)),\n q3Val: clamp(Number(r.q3val)),\n maxVal: clamp(Number(r.maxval)),\n avgVal: clamp(Number(r.avgval)),\n stddevVal: isNaN(Number(r.stddevval)) ? 0 : Math.max(0, Number(r.stddevval)),\n projectCount: isNaN(Number(r.projectcount)) ? 0 : Number(r.projectcount)\n }))\n }\n\n @Directive('@privilege(category: \"kpi\", privilege: \"read\", domainOwnerGranted: true, superUserGranted: true)')\n @Query(() => [KpiComprehensiveStatsByGeoGroup], {\n description: 'Get KPI statistics by sigungu (geo_group code) level'\n })\n async kpiZValueStatsBySigungu(\n @Arg('kpiName', { nullable: true }) kpiName?: string,\n @Arg('startYearMonth', { nullable: true }) startYearMonth?: string,\n @Arg('endYearMonth', { nullable: true }) endYearMonth?: string,\n @Arg('sectorType', { nullable: true }) sectorType?: string,\n @Arg('buildingUsage', { nullable: true }) buildingUsage?: string,\n @Ctx() context?: ResolverContext\n ): Promise<KpiComprehensiveStatsByGeoGroup[]> {\n const { domain } = context.state\n\n const queryBuilder = getRepository('kpi_values')\n .createQueryBuilder('kv')\n .select([\n 'p.geo_group as geoGroup',\n 'MIN(kv.score) as minVal',\n 'PERCENTILE_CONT(0.25) WITHIN GROUP (ORDER BY kv.score) as q1Val',\n 'PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY kv.score) as medVal',\n 'PERCENTILE_CONT(0.75) WITHIN GROUP (ORDER BY kv.score) as q3Val',\n 'MAX(kv.score) as maxVal',\n 'AVG(kv.score) as avgVal',\n 'COUNT(DISTINCT p.id) as projectCount'\n ])\n .innerJoin('kpis', 'k', 'kv.kpi_id = k.id')\n .innerJoin('projects', 'p', 'kv.kpi_org_scope_id = p.id')\n .where('p.end_date IS NOT NULL')\n .andWhere('p.geo_group IS NOT NULL')\n .andWhere('kv.domain_id IN (:...domainIds)', { domainIds: await getDomainIdsWithAncestors(domain) })\n\n if (startYearMonth?.trim()) {\n queryBuilder.andWhere(`TO_CHAR(p.end_date, 'YYYY-MM') >= :startYearMonth`, { startYearMonth })\n }\n if (endYearMonth?.trim()) {\n queryBuilder.andWhere(`TO_CHAR(p.end_date, 'YYYY-MM') <= :endYearMonth`, { endYearMonth })\n }\n if (sectorType?.trim()) {\n queryBuilder.andWhere('p.sector_type = :sectorType', { sectorType })\n }\n if (buildingUsage?.trim()) {\n queryBuilder.andWhere('p.building_usage = :buildingUsage', { buildingUsage })\n }\n\n if (kpiName?.trim()) {\n queryBuilder.andWhere('k.name = :kpiName', { kpiName })\n } else {\n queryBuilder.andWhere('k.name LIKE :pattern', { pattern: 'Z%' })\n }\n\n queryBuilder.groupBy('p.geo_group')\n\n const results = await queryBuilder.getRawMany()\n const clamp = (v: number) => Math.min(Math.max(isNaN(v) ? 0 : v, 0), 1)\n return results\n .map(r => ({\n kpiName: r.kpiname || undefined,\n geoGroup: r.geogroup || null,\n minVal: clamp(Number(r.minval)),\n q1Val: clamp(Number(r.q1val)),\n medVal: clamp(Number(r.medval)),\n q3Val: clamp(Number(r.q3val)),\n maxVal: clamp(Number(r.maxval)),\n avgVal: clamp(Number(r.avgval)),\n projectCount: isNaN(Number(r.projectcount)) ? 0 : Number(r.projectcount)\n }))\n .filter(r => r.geoGroup !== null)\n }\n\n @Directive('@privilege(category: \"kpi\", privilege: \"read\", domainOwnerGranted: true, superUserGranted: true)')\n @Query(() => [KpiComprehensiveStats], { description: 'Get Y-level KPI statistics by geo_group code (sigungu)' })\n async kpiYValueStatsByGeoGroup(\n @Arg('geoGroup') geoGroup: string,\n @Arg('startYearMonth', { nullable: true }) startYearMonth?: string,\n @Arg('endYearMonth', { nullable: true }) endYearMonth?: string,\n @Ctx() context?: ResolverContext\n ): Promise<KpiComprehensiveStats[]> {\n const { domain } = context.state\n\n const queryBuilder = getRepository('kpi_values')\n .createQueryBuilder('kv')\n .select([\n 'k.name as kpiName',\n 'MIN(kv.score) as minVal',\n 'PERCENTILE_CONT(0.25) WITHIN GROUP (ORDER BY kv.score) as q1Val',\n 'PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY kv.score) as medVal',\n 'PERCENTILE_CONT(0.75) WITHIN GROUP (ORDER BY kv.score) as q3Val',\n 'MAX(kv.score) as maxVal',\n 'AVG(kv.score) as avgVal',\n 'COUNT(DISTINCT p.id) as projectCount'\n ])\n .innerJoin('kpis', 'k', 'kv.kpi_id = k.id')\n .innerJoin('projects', 'p', 'kv.kpi_org_scope_id = p.id')\n .where('k.name LIKE :pattern', { pattern: 'Y%' })\n .andWhere('p.end_date IS NOT NULL')\n .andWhere('p.geo_group = :geoGroup', { geoGroup })\n .andWhere('kv.domain_id IN (:...domainIds)', { domainIds: await getDomainIdsWithAncestors(domain) })\n\n if (startYearMonth?.trim()) {\n queryBuilder.andWhere(`TO_CHAR(p.end_date, 'YYYY-MM') >= :startYearMonth`, { startYearMonth })\n }\n if (endYearMonth?.trim()) {\n queryBuilder.andWhere(`TO_CHAR(p.end_date, 'YYYY-MM') <= :endYearMonth`, { endYearMonth })\n }\n\n queryBuilder.groupBy('k.name').orderBy('k.name', 'ASC')\n\n const results = await queryBuilder.getRawMany()\n const clamp = (v: number) => Math.min(Math.max(isNaN(v) ? 0 : v, 0), 1)\n return results.map(r => ({\n kpiName: r.kpiname,\n minVal: clamp(Number(r.minval)),\n q1Val: clamp(Number(r.q1val)),\n medVal: clamp(Number(r.medval)),\n q3Val: clamp(Number(r.q3val)),\n maxVal: clamp(Number(r.maxval)),\n avgVal: clamp(Number(r.avgval)),\n projectCount: isNaN(Number(r.projectcount)) ? 0 : Number(r.projectcount)\n }))\n }\n\n @Directive('@privilege(category: \"kpi\", privilege: \"read\", domainOwnerGranted: true, superUserGranted: true)')\n @Query(() => [KpiComprehensiveStats], { description: 'Get KPI statistics for Y-category KPIs by specific metro area' })\n async kpiYValueStatsByMetroArea(\n @Arg('metroArea') metroArea: string,\n @Arg('startYearMonth', { nullable: true }) startYearMonth?: string,\n @Arg('endYearMonth', { nullable: true }) endYearMonth?: string,\n @Ctx() context?: ResolverContext\n ): Promise<KpiComprehensiveStats[]> {\n if (!context || !context.state) {\n console.error('Context is undefined or missing state')\n return []\n }\n\n const { domain } = context.state\n\n const queryBuilder = getRepository('kpi_values')\n .createQueryBuilder('kv')\n .select([\n 'k.name as kpiName',\n 'MIN(kv.score) as minVal',\n 'PERCENTILE_CONT(0.25) WITHIN GROUP (ORDER BY kv.score) as q1Val',\n 'PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY kv.score) as medVal',\n 'PERCENTILE_CONT(0.75) WITHIN GROUP (ORDER BY kv.score) as q3Val',\n 'MAX(kv.score) as maxVal',\n 'AVG(kv.score) as avgVal',\n 'COUNT(DISTINCT p.id) as projectCount'\n ])\n .innerJoin('kpis', 'k', 'kv.kpi_id = k.id')\n .innerJoin('projects', 'p', 'kv.kpi_org_scope_id = p.id')\n .where('k.name LIKE :pattern', { pattern: 'Y%' })\n .andWhere('p.end_date IS NOT NULL')\n .andWhere('p.geo_group IS NOT NULL')\n .andWhere('kv.domain_id IN (:...domainIds)', { domainIds: await getDomainIdsWithAncestors(domain) })\n\n // 기간 필터\n if (startYearMonth && startYearMonth.trim() !== '') {\n queryBuilder.andWhere(`TO_CHAR(p.end_date, 'YYYY-MM') >= :startYearMonth`, { startYearMonth })\n }\n if (endYearMonth && endYearMonth.trim() !== '') {\n queryBuilder.andWhere(`TO_CHAR(p.end_date, 'YYYY-MM') <= :endYearMonth`, { endYearMonth })\n }\n\n queryBuilder\n .andWhere(\n `CASE\n WHEN p.geo_group IN ('01','02','03','04','05','06','07','08') THEN '서울특별시'\n WHEN p.geo_group IN ('46','47','48','49') THEN '부산광역시'\n WHEN p.geo_group IN ('41','42','43') THEN '대구광역시'\n WHEN p.geo_group IN ('21','22','23') THEN '인천광역시'\n WHEN p.geo_group IN ('61','62') THEN '광주광역시'\n WHEN p.geo_group IN ('34','35') THEN '대전광역시'\n WHEN p.geo_group IN ('44','45') THEN '울산광역시'\n WHEN p.geo_group = '30' THEN '세종특별자치시'\n WHEN p.geo_group IN ('10','11','12','13','14','15','16','17','18') THEN '경기도'\n WHEN p.geo_group IN ('24','25','26','33') THEN '강원도'\n WHEN p.geo_group IN ('27','28','29') THEN '충청북도'\n WHEN p.geo_group IN ('31','32') THEN '충청남도'\n WHEN p.geo_group IN ('54','55','56') THEN '전라북도'\n WHEN p.geo_group IN ('57','58','59') THEN '전라남도'\n WHEN p.geo_group IN ('36','37','38','39','40') THEN '경상북도'\n WHEN p.geo_group IN ('50','51','52','53') THEN '경상남도'\n WHEN p.geo_group = '63' THEN '제주특별자치도'\n END = :metroArea`,\n { metroArea }\n )\n .groupBy('k.name')\n .orderBy('k.name', 'ASC')\n\n const results = await queryBuilder.getRawMany()\n\n return results.map(result => {\n const kpiName = result.kpiname\n const minVal = Math.min(Math.max(Number(result.minval), 0), 1)\n const q1Val = Math.min(Math.max(Number(result.q1val), 0), 1)\n const medVal = Math.min(Math.max(Number(result.medval), 0), 1)\n const q3Val = Math.min(Math.max(Number(result.q3val), 0), 1)\n const avgVal = Math.min(Math.max(Number(result.avgval), 0), 1)\n const maxVal = Math.min(Math.max(Number(result.maxval), 0), 1)\n const projectCount = Number(result.projectcount)\n\n return {\n kpiName: kpiName,\n minVal: isNaN(minVal) ? 0 : minVal,\n q1Val: isNaN(q1Val) ? 0 : q1Val,\n medVal: isNaN(medVal) ? 0 : medVal,\n q3Val: isNaN(q3Val) ? 0 : q3Val,\n maxVal: isNaN(maxVal) ? 0 : maxVal,\n avgVal: isNaN(avgVal) ? 0 : avgVal,\n projectCount: isNaN(projectCount) ? 0 : projectCount\n }\n })\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"kpi-stat-query.js","sourceRoot":"","sources":["../../../server/service/kpi-stat/kpi-stat-query.ts"],"names":[],"mappings":"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","sourcesContent":["import { Resolver, Query, Arg, Ctx, Directive } from 'type-graphql'\nimport { getRepository } from '@things-factory/shell'\nimport type ResolverContext from '@things-factory/auth-base'\nimport { KpiStatistic } from '@things-factory/kpi'\nimport { getDomainIdsWithAncestors } from '@things-factory/kpi/dist-server/service/utils/domain-inheritance.js'\nimport { KpiComprehensiveStats, KpiComprehensiveStatsByGeoGroup, KpiMonthlyTrend, KpiProjectStat } from './kpi-stat-types'\n\n@Resolver(KpiStatistic)\nexport class KpiStatQuery {\n @Directive('@privilege(category: \"kpi\", privilege: \"read\", domainOwnerGranted: true, superUserGranted: true)')\n @Query(() => [KpiComprehensiveStats], { description: 'Get KPI box plot statistics for Z-category KPIs for all projects' })\n async totalKpiZValueComprehensiveStats(\n @Arg('startYearMonth', { nullable: true }) startYearMonth?: string,\n @Arg('endYearMonth', { nullable: true }) endYearMonth?: string,\n @Arg('sectorType', { nullable: true }) sectorType?: string,\n @Arg('buildingUsage', { nullable: true }) buildingUsage?: string,\n @Ctx() context?: ResolverContext\n ): Promise<KpiComprehensiveStats[]> {\n const { domain } = context.state\n\n const queryBuilder = getRepository('kpi_values')\n .createQueryBuilder('kv')\n .select([\n 'k.name as kpiName',\n 'MIN(kv.score) as minVal',\n 'PERCENTILE_CONT(0.25) WITHIN GROUP (ORDER BY kv.score) as q1Val',\n 'PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY kv.score) as medVal',\n 'PERCENTILE_CONT(0.75) WITHIN GROUP (ORDER BY kv.score) as q3Val',\n 'AVG(kv.score) as avgVal',\n 'MAX(kv.score) as maxVal',\n 'COUNT(DISTINCT p.id) as projectCount'\n ])\n .innerJoin('kpis', 'k', 'kv.kpi_id = k.id')\n .innerJoin('projects', 'p', 'kv.kpi_org_scope_id = p.id')\n .where('k.name LIKE :pattern', { pattern: 'Z%' })\n .andWhere('p.end_date IS NOT NULL')\n .andWhere('kv.domain_id IN (:...domainIds)', { domainIds: await getDomainIdsWithAncestors(domain) })\n\n // 기간 필터\n if (startYearMonth && startYearMonth.trim() !== '') {\n queryBuilder.andWhere(`LEFT(kv.value_date, 7) >= :startYearMonth`, { startYearMonth })\n }\n if (endYearMonth && endYearMonth.trim() !== '') {\n queryBuilder.andWhere(`LEFT(kv.value_date, 7) <= :endYearMonth`, { endYearMonth })\n }\n if (sectorType?.trim()) {\n queryBuilder.andWhere('p.sector_type = :sectorType', { sectorType })\n }\n if (buildingUsage?.trim()) {\n queryBuilder.andWhere('p.building_usage = :buildingUsage', { buildingUsage })\n }\n\n queryBuilder.groupBy('k.name')\n\n const results = await queryBuilder.getRawMany()\n\n return results.map(result => {\n const kpiName = result.kpiname\n const minVal = Math.min(Math.max(Number(result.minval), 0), 1)\n const q1Val = Math.min(Math.max(Number(result.q1val), 0), 1)\n const medVal = Math.min(Math.max(Number(result.medval), 0), 1)\n const q3Val = Math.min(Math.max(Number(result.q3val), 0), 1)\n const avgVal = Math.min(Math.max(Number(result.avgval), 0), 1)\n const maxVal = Math.min(Math.max(Number(result.maxval), 0), 1)\n const projectCount = Number(result.projectcount)\n\n return {\n kpiName: kpiName,\n minVal: isNaN(minVal) ? 0 : minVal,\n q1Val: isNaN(q1Val) ? 0 : q1Val,\n medVal: isNaN(medVal) ? 0 : medVal,\n q3Val: isNaN(q3Val) ? 0 : q3Val,\n maxVal: isNaN(maxVal) ? 0 : maxVal,\n avgVal: isNaN(avgVal) ? 0 : avgVal,\n projectCount: isNaN(projectCount) ? 0 : projectCount\n }\n })\n }\n\n @Directive('@privilege(category: \"kpi\", privilege: \"read\", domainOwnerGranted: true, superUserGranted: true)')\n @Query(() => [KpiComprehensiveStats], { description: 'Get KPI box plot statistics for Y-category KPIs for all projects' })\n async totalKpiYValueComprehensiveStats(\n @Arg('startYearMonth', { nullable: true }) startYearMonth?: string,\n @Arg('endYearMonth', { nullable: true }) endYearMonth?: string,\n @Arg('sectorType', { nullable: true }) sectorType?: string,\n @Arg('buildingUsage', { nullable: true }) buildingUsage?: string,\n @Ctx() context?: ResolverContext\n ): Promise<KpiComprehensiveStats[]> {\n const { domain } = context.state\n\n const queryBuilder = getRepository('kpi_values')\n .createQueryBuilder('kv')\n .select([\n 'k.name as kpiName',\n 'MIN(kv.score) as minVal',\n 'PERCENTILE_CONT(0.25) WITHIN GROUP (ORDER BY kv.score) as q1Val',\n 'PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY kv.score) as medVal',\n 'PERCENTILE_CONT(0.75) WITHIN GROUP (ORDER BY kv.score) as q3Val',\n 'AVG(kv.score) as avgVal',\n 'MAX(kv.score) as maxVal',\n 'COUNT(DISTINCT p.id) as projectCount'\n ])\n .innerJoin('kpis', 'k', 'kv.kpi_id = k.id')\n .innerJoin('projects', 'p', 'kv.kpi_org_scope_id = p.id')\n .where('k.name LIKE :pattern', { pattern: 'Y%' })\n .andWhere('p.end_date IS NOT NULL')\n .andWhere('kv.domain_id IN (:...domainIds)', { domainIds: await getDomainIdsWithAncestors(domain) })\n\n // 기간 필터\n if (startYearMonth && startYearMonth.trim() !== '') {\n queryBuilder.andWhere(`LEFT(kv.value_date, 7) >= :startYearMonth`, { startYearMonth })\n }\n if (endYearMonth && endYearMonth.trim() !== '') {\n queryBuilder.andWhere(`LEFT(kv.value_date, 7) <= :endYearMonth`, { endYearMonth })\n }\n if (sectorType?.trim()) {\n queryBuilder.andWhere('p.sector_type = :sectorType', { sectorType })\n }\n if (buildingUsage?.trim()) {\n queryBuilder.andWhere('p.building_usage = :buildingUsage', { buildingUsage })\n }\n\n queryBuilder.groupBy('k.name').orderBy('k.name', 'ASC')\n\n const results = await queryBuilder.getRawMany()\n\n return results.map(result => {\n const kpiName = result.kpiname\n const minVal = Math.min(Math.max(Number(result.minval), 0), 1)\n const q1Val = Math.min(Math.max(Number(result.q1val), 0), 1)\n const medVal = Math.min(Math.max(Number(result.medval), 0), 1)\n const q3Val = Math.min(Math.max(Number(result.q3val), 0), 1)\n const avgVal = Math.min(Math.max(Number(result.avgval), 0), 1)\n const maxVal = Math.min(Math.max(Number(result.maxval), 0), 1)\n const projectCount = Number(result.projectcount)\n\n return {\n kpiName: kpiName,\n minVal: isNaN(minVal) ? 0 : minVal,\n q1Val: isNaN(q1Val) ? 0 : q1Val,\n medVal: isNaN(medVal) ? 0 : medVal,\n q3Val: isNaN(q3Val) ? 0 : q3Val,\n maxVal: isNaN(maxVal) ? 0 : maxVal,\n avgVal: isNaN(avgVal) ? 0 : avgVal,\n projectCount: isNaN(projectCount) ? 0 : projectCount\n }\n })\n }\n\n @Directive('@privilege(category: \"kpi\", privilege: \"read\", domainOwnerGranted: true, superUserGranted: true)')\n @Query(() => [KpiComprehensiveStatsByGeoGroup], {\n description: 'Get KPI box plot statistics for Z-category KPIs by metro area'\n })\n async kpiZValueComprehensiveStatsByGeoGroup(\n @Arg('geoGroup', { nullable: true }) geoGroup?: string,\n @Arg('kpiName', { nullable: true }) kpiName?: string,\n @Arg('startYearMonth', { nullable: true }) startYearMonth?: string,\n @Arg('endYearMonth', { nullable: true }) endYearMonth?: string,\n @Arg('sectorType', { nullable: true }) sectorType?: string,\n @Arg('buildingUsage', { nullable: true }) buildingUsage?: string,\n @Ctx() context?: ResolverContext\n ): Promise<KpiComprehensiveStatsByGeoGroup[]> {\n const { domain } = context.state\n\n const queryBuilder = getRepository('kpi_values')\n .createQueryBuilder('kv')\n .select([\n `CASE\n WHEN p.geo_group IN ('01','02','03','04','05','06','07','08') THEN '서울특별시'\n WHEN p.geo_group IN ('46','47','48','49') THEN '부산광역시'\n WHEN p.geo_group IN ('41','42','43') THEN '대구광역시'\n WHEN p.geo_group IN ('21','22','23') THEN '인천광역시'\n WHEN p.geo_group IN ('61','62') THEN '광주광역시'\n WHEN p.geo_group IN ('34','35') THEN '대전광역시'\n WHEN p.geo_group IN ('44','45') THEN '울산광역시'\n WHEN p.geo_group = '30' THEN '세종특별자치시'\n WHEN p.geo_group IN ('10','11','12','13','14','15','16','17','18') THEN '경기도'\n WHEN p.geo_group IN ('24','25','26','33') THEN '강원도'\n WHEN p.geo_group IN ('27','28','29') THEN '충청북도'\n WHEN p.geo_group IN ('31','32') THEN '충청남도'\n WHEN p.geo_group IN ('54','55','56') THEN '전라북도'\n WHEN p.geo_group IN ('57','58','59') THEN '전라남도'\n WHEN p.geo_group IN ('36','37','38','39','40') THEN '경상북도'\n WHEN p.geo_group IN ('50','51','52','53') THEN '경상남도'\n WHEN p.geo_group = '63' THEN '제주특별자치도'\n END as geoGroup`,\n 'MIN(kv.score) as minVal',\n 'PERCENTILE_CONT(0.25) WITHIN GROUP (ORDER BY kv.score) as q1Val',\n 'PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY kv.score) as medVal',\n 'PERCENTILE_CONT(0.75) WITHIN GROUP (ORDER BY kv.score) as q3Val',\n 'MAX(kv.score) as maxVal',\n 'AVG(kv.score) as avgVal',\n 'COUNT(DISTINCT p.id) as projectCount'\n ])\n .innerJoin('kpis', 'k', 'kv.kpi_id = k.id')\n .innerJoin('projects', 'p', 'kv.kpi_org_scope_id = p.id')\n .where('p.end_date IS NOT NULL')\n .andWhere('p.geo_group IS NOT NULL')\n .andWhere('kv.domain_id IN (:...domainIds)', { domainIds: await getDomainIdsWithAncestors(domain) })\n\n // 기간 필터\n if (startYearMonth && startYearMonth.trim() !== '') {\n queryBuilder.andWhere(`LEFT(kv.value_date, 7) >= :startYearMonth`, { startYearMonth })\n }\n if (endYearMonth && endYearMonth.trim() !== '') {\n queryBuilder.andWhere(`LEFT(kv.value_date, 7) <= :endYearMonth`, { endYearMonth })\n }\n if (sectorType?.trim()) {\n queryBuilder.andWhere('p.sector_type = :sectorType', { sectorType })\n }\n if (buildingUsage?.trim()) {\n queryBuilder.andWhere('p.building_usage = :buildingUsage', { buildingUsage })\n }\n\n // KPI 필터: kpiName이 지정되면 해당 Y-level KPI만, 없으면 Z-level KPI 전체\n if (kpiName && kpiName.trim() !== '') {\n queryBuilder.andWhere('k.name = :kpiName', { kpiName })\n } else {\n queryBuilder.andWhere('k.name LIKE :pattern', { pattern: 'Z%' })\n }\n\n queryBuilder.groupBy('geoGroup')\n\n if (geoGroup && geoGroup.trim() !== '') {\n queryBuilder.having('geoGroup = :geoGroup', { geoGroup })\n }\n\n const results = await queryBuilder.getRawMany()\n return results\n .map(result => {\n const kpiName = result.kpiname\n const minVal = Math.min(Math.max(Number(result.minval), 0), 1)\n const q1Val = Math.min(Math.max(Number(result.q1val), 0), 1)\n const medVal = Math.min(Math.max(Number(result.medval), 0), 1)\n const q3Val = Math.min(Math.max(Number(result.q3val), 0), 1)\n const maxVal = Math.min(Math.max(Number(result.maxval), 0), 1)\n const avgVal = Math.min(Math.max(Number(result.avgval), 0), 1)\n const projectCount = Number(result.projectcount)\n\n return {\n kpiName: kpiName,\n geoGroup: result.geogroup || null,\n minVal: isNaN(minVal) ? 0 : minVal,\n q1Val: isNaN(q1Val) ? 0 : q1Val,\n medVal: isNaN(medVal) ? 0 : medVal,\n q3Val: isNaN(q3Val) ? 0 : q3Val,\n maxVal: isNaN(maxVal) ? 0 : maxVal,\n avgVal: isNaN(avgVal) ? 0 : avgVal,\n projectCount: isNaN(projectCount) ? 0 : projectCount\n }\n })\n .filter(result => result.geoGroup !== null)\n }\n\n @Directive('@privilege(category: \"kpi\", privilege: \"read\", domainOwnerGranted: true, superUserGranted: true)')\n @Query(() => [KpiComprehensiveStatsByGeoGroup], { description: 'Get KPI box plot statistics for Y-category KPIs by geo group' })\n async kpiYValueComprehensiveStatsByGeoGroup(\n @Arg('geoGroup', { nullable: true }) geoGroup?: string,\n @Ctx() context?: ResolverContext\n ): Promise<KpiComprehensiveStatsByGeoGroup[]> {\n const { domain } = context.state\n\n const queryBuilder = getRepository('kpi_values')\n .createQueryBuilder('kv')\n .select([\n 'p.geo_group as geoGroup',\n 'k.name as kpiName',\n 'MIN(kv.score) as minVal',\n 'PERCENTILE_CONT(0.25) WITHIN GROUP (ORDER BY kv.score) as q1Val',\n 'PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY kv.score) as medVal',\n 'PERCENTILE_CONT(0.75) WITHIN GROUP (ORDER BY kv.score) as q3Val',\n 'MAX(kv.score) as maxVal',\n 'AVG(kv.score) as avgVal',\n 'COUNT(DISTINCT p.id) as projectCount'\n ])\n .innerJoin('kpis', 'k', 'kv.kpi_id = k.id')\n .innerJoin('projects', 'p', 'kv.kpi_org_scope_id = p.id')\n .where('k.name LIKE :pattern', { pattern: 'Y%' })\n .andWhere('p.end_date IS NOT NULL')\n .andWhere('p.geo_group IS NOT NULL')\n .andWhere('kv.domain_id IN (:...domainIds)', { domainIds: await getDomainIdsWithAncestors(domain) })\n .groupBy('p.geo_group, k.name')\n\n if (geoGroup && geoGroup.trim() !== '') {\n queryBuilder.andWhere('p.geo_group LIKE :geoGroup', { geoGroup: `%${geoGroup}%` })\n }\n\n const results = await queryBuilder.getRawMany()\n return results\n .map(result => {\n const kpiName = result.kpiname\n const minVal = Math.min(Math.max(Number(result.minval), 0), 1)\n const q1Val = Math.min(Math.max(Number(result.q1val), 0), 1)\n const medVal = Math.min(Math.max(Number(result.medval), 0), 1)\n const q3Val = Math.min(Math.max(Number(result.q3val), 0), 1)\n const maxVal = Math.min(Math.max(Number(result.maxval), 0), 1)\n const avgVal = Math.min(Math.max(Number(result.avgval), 0), 1)\n const projectCount = Number(result.projectcount)\n\n return {\n kpiName: kpiName,\n geoGroup: result.geogroup || null,\n minVal: isNaN(minVal) ? 0 : minVal,\n q1Val: isNaN(q1Val) ? 0 : q1Val,\n medVal: isNaN(medVal) ? 0 : medVal,\n q3Val: isNaN(q3Val) ? 0 : q3Val,\n maxVal: isNaN(maxVal) ? 0 : maxVal,\n avgVal: isNaN(avgVal) ? 0 : avgVal,\n projectCount: isNaN(projectCount) ? 0 : projectCount\n }\n })\n .filter(result => result.geoGroup !== null)\n }\n\n @Directive('@privilege(category: \"kpi\", privilege: \"read\", domainOwnerGranted: true, superUserGranted: true)')\n @Query(() => [KpiMonthlyTrend], { description: 'Get monthly KPI trend for Z-category KPIs by metro area' })\n async kpiZValueMonthlyTrendByGeoGroup(\n @Arg('kpiName', { nullable: true }) kpiName?: string,\n @Arg('startYearMonth', { nullable: true }) startYearMonth?: string,\n @Arg('endYearMonth', { nullable: true }) endYearMonth?: string,\n @Arg('sectorType', { nullable: true }) sectorType?: string,\n @Arg('buildingUsage', { nullable: true }) buildingUsage?: string,\n @Ctx() context?: ResolverContext\n ): Promise<KpiMonthlyTrend[]> {\n const { domain } = context.state\n\n const queryBuilder = getRepository('kpi_values')\n .createQueryBuilder('kv')\n .select([\n `CASE\n WHEN p.geo_group IN ('01','02','03','04','05','06','07','08') THEN '서울특별시'\n WHEN p.geo_group IN ('46','47','48','49') THEN '부산광역시'\n WHEN p.geo_group IN ('41','42','43') THEN '대구광역시'\n WHEN p.geo_group IN ('21','22','23') THEN '인천광역시'\n WHEN p.geo_group IN ('61','62') THEN '광주광역시'\n WHEN p.geo_group IN ('34','35') THEN '대전광역시'\n WHEN p.geo_group IN ('44','45') THEN '울산광역시'\n WHEN p.geo_group = '30' THEN '세종특별자치시'\n WHEN p.geo_group IN ('10','11','12','13','14','15','16','17','18') THEN '경기도'\n WHEN p.geo_group IN ('24','25','26','33') THEN '강원도'\n WHEN p.geo_group IN ('27','28','29') THEN '충청북도'\n WHEN p.geo_group IN ('31','32') THEN '충청남도'\n WHEN p.geo_group IN ('54','55','56') THEN '전라북도'\n WHEN p.geo_group IN ('57','58','59') THEN '전라남도'\n WHEN p.geo_group IN ('36','37','38','39','40') THEN '경상북도'\n WHEN p.geo_group IN ('50','51','52','53') THEN '경상남도'\n WHEN p.geo_group = '63' THEN '제주특별자치도'\n END as geoGroup`,\n // 월 기준 = KPI 측정월(kv.value_date, 'YYYY-MM-DD' 문자열) — 프로젝트 준공월(p.end_date) 아님.\n `LEFT(kv.value_date, 7) as yearMonth`,\n 'AVG(kv.score) as avgVal',\n 'COUNT(DISTINCT p.id) as projectCount'\n ])\n .innerJoin('kpis', 'k', 'kv.kpi_id = k.id')\n .innerJoin('projects', 'p', 'kv.kpi_org_scope_id = p.id')\n .where('kv.value_date IS NOT NULL')\n .andWhere('p.geo_group IS NOT NULL')\n .andWhere('kv.domain_id IN (:...domainIds)', { domainIds: await getDomainIdsWithAncestors(domain) })\n\n // 기간 필터 — KPI 측정월(kv.value_date) 기준\n if (startYearMonth && startYearMonth.trim() !== '') {\n queryBuilder.andWhere(`LEFT(kv.value_date, 7) >= :startYearMonth`, { startYearMonth })\n }\n if (endYearMonth && endYearMonth.trim() !== '') {\n queryBuilder.andWhere(`LEFT(kv.value_date, 7) <= :endYearMonth`, { endYearMonth })\n }\n if (sectorType?.trim()) {\n queryBuilder.andWhere('p.sector_type = :sectorType', { sectorType })\n }\n if (buildingUsage?.trim()) {\n queryBuilder.andWhere('p.building_usage = :buildingUsage', { buildingUsage })\n }\n\n // KPI 필터: kpiName이 지정되면 해당 Y-level KPI만, 없으면 Z-level KPI 전체\n if (kpiName && kpiName.trim() !== '') {\n queryBuilder.andWhere('k.name = :kpiName', { kpiName })\n } else {\n queryBuilder.andWhere('k.name LIKE :pattern', { pattern: 'Z%' })\n }\n\n queryBuilder.groupBy('geoGroup, yearMonth').orderBy('yearMonth', 'ASC')\n\n const results = await queryBuilder.getRawMany()\n return results\n .map(result => {\n const avgVal = Math.min(Math.max(Number(result.avgval), 0), 1)\n const projectCount = Number(result.projectcount)\n\n return {\n geoGroup: result.geogroup || null,\n yearMonth: result.yearmonth,\n avgVal: isNaN(avgVal) ? 0 : avgVal,\n projectCount: isNaN(projectCount) ? 0 : projectCount\n }\n })\n .filter(result => result.geoGroup !== null)\n }\n\n @Directive('@privilege(category: \"kpi\", privilege: \"read\", domainOwnerGranted: true, superUserGranted: true)')\n @Query(() => [KpiProjectStat], { description: 'Get KPI stats aggregated from project data with optional sectorType/buildingUsage filters' })\n async kpiProjectStats(\n @Arg('sectorType', { nullable: true }) sectorType?: string,\n @Arg('buildingUsage', { nullable: true }) buildingUsage?: string,\n @Arg('kpiNamePattern', { nullable: true }) kpiNamePattern?: string,\n @Arg('startYearMonth', { nullable: true }) startYearMonth?: string,\n @Arg('endYearMonth', { nullable: true }) endYearMonth?: string,\n @Ctx() context?: ResolverContext\n ): Promise<KpiProjectStat[]> {\n const { domain } = context.state\n\n const qb = getRepository('kpi_values')\n .createQueryBuilder('kv')\n .select([\n 'k.name as kpiName',\n 'pk.name as categoryName',\n 'MIN(kv.score) as minVal',\n 'PERCENTILE_CONT(0.25) WITHIN GROUP (ORDER BY kv.score) as q1Val',\n 'PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY kv.score) as medVal',\n 'PERCENTILE_CONT(0.75) WITHIN GROUP (ORDER BY kv.score) as q3Val',\n 'MAX(kv.score) as maxVal',\n 'AVG(kv.score) as avgVal',\n 'STDDEV_POP(kv.score) as stddevVal',\n 'COUNT(DISTINCT p.id) as projectCount'\n ])\n .innerJoin('kpis', 'k', 'kv.kpi_id = k.id')\n .leftJoin('kpis', 'pk', 'k.parent_id = pk.id')\n .innerJoin('projects', 'p', 'kv.kpi_org_scope_id = p.id')\n .where('p.end_date IS NOT NULL')\n .andWhere('kv.domain_id IN (:...domainIds)', { domainIds: await getDomainIdsWithAncestors(domain) })\n\n if (sectorType?.trim()) {\n qb.andWhere('p.sector_type = :sectorType', { sectorType })\n }\n if (buildingUsage?.trim()) {\n qb.andWhere('p.building_usage = :buildingUsage', { buildingUsage })\n }\n if (kpiNamePattern?.trim()) {\n qb.andWhere('k.name LIKE :kpiNamePattern', { kpiNamePattern: `${kpiNamePattern}%` })\n }\n if (startYearMonth?.trim()) {\n qb.andWhere(`LEFT(kv.value_date, 7) >= :startYearMonth`, { startYearMonth })\n }\n if (endYearMonth?.trim()) {\n qb.andWhere(`LEFT(kv.value_date, 7) <= :endYearMonth`, { endYearMonth })\n }\n\n qb.groupBy('k.name, pk.name').orderBy('k.name', 'ASC')\n\n const results = await qb.getRawMany()\n const clamp = (v: number) => Math.min(Math.max(isNaN(v) ? 0 : v, 0), 1)\n return results.map(r => ({\n kpiName: r.kpiname,\n categoryName: r.categoryname || undefined,\n minVal: clamp(Number(r.minval)),\n q1Val: clamp(Number(r.q1val)),\n medVal: clamp(Number(r.medval)),\n q3Val: clamp(Number(r.q3val)),\n maxVal: clamp(Number(r.maxval)),\n avgVal: clamp(Number(r.avgval)),\n stddevVal: isNaN(Number(r.stddevval)) ? 0 : Math.max(0, Number(r.stddevval)),\n projectCount: isNaN(Number(r.projectcount)) ? 0 : Number(r.projectcount)\n }))\n }\n\n @Directive('@privilege(category: \"kpi\", privilege: \"read\", domainOwnerGranted: true, superUserGranted: true)')\n @Query(() => [KpiComprehensiveStatsByGeoGroup], {\n description: 'Get KPI statistics by sigungu (geo_group code) level'\n })\n async kpiZValueStatsBySigungu(\n @Arg('kpiName', { nullable: true }) kpiName?: string,\n @Arg('startYearMonth', { nullable: true }) startYearMonth?: string,\n @Arg('endYearMonth', { nullable: true }) endYearMonth?: string,\n @Arg('sectorType', { nullable: true }) sectorType?: string,\n @Arg('buildingUsage', { nullable: true }) buildingUsage?: string,\n @Ctx() context?: ResolverContext\n ): Promise<KpiComprehensiveStatsByGeoGroup[]> {\n const { domain } = context.state\n\n const queryBuilder = getRepository('kpi_values')\n .createQueryBuilder('kv')\n .select([\n 'p.geo_group as geoGroup',\n 'MIN(kv.score) as minVal',\n 'PERCENTILE_CONT(0.25) WITHIN GROUP (ORDER BY kv.score) as q1Val',\n 'PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY kv.score) as medVal',\n 'PERCENTILE_CONT(0.75) WITHIN GROUP (ORDER BY kv.score) as q3Val',\n 'MAX(kv.score) as maxVal',\n 'AVG(kv.score) as avgVal',\n 'COUNT(DISTINCT p.id) as projectCount'\n ])\n .innerJoin('kpis', 'k', 'kv.kpi_id = k.id')\n .innerJoin('projects', 'p', 'kv.kpi_org_scope_id = p.id')\n .where('p.end_date IS NOT NULL')\n .andWhere('p.geo_group IS NOT NULL')\n .andWhere('kv.domain_id IN (:...domainIds)', { domainIds: await getDomainIdsWithAncestors(domain) })\n\n if (startYearMonth?.trim()) {\n queryBuilder.andWhere(`LEFT(kv.value_date, 7) >= :startYearMonth`, { startYearMonth })\n }\n if (endYearMonth?.trim()) {\n queryBuilder.andWhere(`LEFT(kv.value_date, 7) <= :endYearMonth`, { endYearMonth })\n }\n if (sectorType?.trim()) {\n queryBuilder.andWhere('p.sector_type = :sectorType', { sectorType })\n }\n if (buildingUsage?.trim()) {\n queryBuilder.andWhere('p.building_usage = :buildingUsage', { buildingUsage })\n }\n\n if (kpiName?.trim()) {\n queryBuilder.andWhere('k.name = :kpiName', { kpiName })\n } else {\n queryBuilder.andWhere('k.name LIKE :pattern', { pattern: 'Z%' })\n }\n\n queryBuilder.groupBy('p.geo_group')\n\n const results = await queryBuilder.getRawMany()\n const clamp = (v: number) => Math.min(Math.max(isNaN(v) ? 0 : v, 0), 1)\n return results\n .map(r => ({\n kpiName: r.kpiname || undefined,\n geoGroup: r.geogroup || null,\n minVal: clamp(Number(r.minval)),\n q1Val: clamp(Number(r.q1val)),\n medVal: clamp(Number(r.medval)),\n q3Val: clamp(Number(r.q3val)),\n maxVal: clamp(Number(r.maxval)),\n avgVal: clamp(Number(r.avgval)),\n projectCount: isNaN(Number(r.projectcount)) ? 0 : Number(r.projectcount)\n }))\n .filter(r => r.geoGroup !== null)\n }\n\n @Directive('@privilege(category: \"kpi\", privilege: \"read\", domainOwnerGranted: true, superUserGranted: true)')\n @Query(() => [KpiComprehensiveStats], { description: 'Get Y-level KPI statistics by geo_group code (sigungu)' })\n async kpiYValueStatsByGeoGroup(\n @Arg('geoGroup') geoGroup: string,\n @Arg('startYearMonth', { nullable: true }) startYearMonth?: string,\n @Arg('endYearMonth', { nullable: true }) endYearMonth?: string,\n @Ctx() context?: ResolverContext\n ): Promise<KpiComprehensiveStats[]> {\n const { domain } = context.state\n\n const queryBuilder = getRepository('kpi_values')\n .createQueryBuilder('kv')\n .select([\n 'k.name as kpiName',\n 'MIN(kv.score) as minVal',\n 'PERCENTILE_CONT(0.25) WITHIN GROUP (ORDER BY kv.score) as q1Val',\n 'PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY kv.score) as medVal',\n 'PERCENTILE_CONT(0.75) WITHIN GROUP (ORDER BY kv.score) as q3Val',\n 'MAX(kv.score) as maxVal',\n 'AVG(kv.score) as avgVal',\n 'COUNT(DISTINCT p.id) as projectCount'\n ])\n .innerJoin('kpis', 'k', 'kv.kpi_id = k.id')\n .innerJoin('projects', 'p', 'kv.kpi_org_scope_id = p.id')\n .where('k.name LIKE :pattern', { pattern: 'Y%' })\n .andWhere('p.end_date IS NOT NULL')\n .andWhere('p.geo_group = :geoGroup', { geoGroup })\n .andWhere('kv.domain_id IN (:...domainIds)', { domainIds: await getDomainIdsWithAncestors(domain) })\n\n if (startYearMonth?.trim()) {\n queryBuilder.andWhere(`LEFT(kv.value_date, 7) >= :startYearMonth`, { startYearMonth })\n }\n if (endYearMonth?.trim()) {\n queryBuilder.andWhere(`LEFT(kv.value_date, 7) <= :endYearMonth`, { endYearMonth })\n }\n\n queryBuilder.groupBy('k.name').orderBy('k.name', 'ASC')\n\n const results = await queryBuilder.getRawMany()\n const clamp = (v: number) => Math.min(Math.max(isNaN(v) ? 0 : v, 0), 1)\n return results.map(r => ({\n kpiName: r.kpiname,\n minVal: clamp(Number(r.minval)),\n q1Val: clamp(Number(r.q1val)),\n medVal: clamp(Number(r.medval)),\n q3Val: clamp(Number(r.q3val)),\n maxVal: clamp(Number(r.maxval)),\n avgVal: clamp(Number(r.avgval)),\n projectCount: isNaN(Number(r.projectcount)) ? 0 : Number(r.projectcount)\n }))\n }\n\n @Directive('@privilege(category: \"kpi\", privilege: \"read\", domainOwnerGranted: true, superUserGranted: true)')\n @Query(() => [KpiComprehensiveStats], { description: 'Get KPI statistics for Y-category KPIs by specific metro area' })\n async kpiYValueStatsByMetroArea(\n @Arg('metroArea') metroArea: string,\n @Arg('startYearMonth', { nullable: true }) startYearMonth?: string,\n @Arg('endYearMonth', { nullable: true }) endYearMonth?: string,\n @Ctx() context?: ResolverContext\n ): Promise<KpiComprehensiveStats[]> {\n if (!context || !context.state) {\n console.error('Context is undefined or missing state')\n return []\n }\n\n const { domain } = context.state\n\n const queryBuilder = getRepository('kpi_values')\n .createQueryBuilder('kv')\n .select([\n 'k.name as kpiName',\n 'MIN(kv.score) as minVal',\n 'PERCENTILE_CONT(0.25) WITHIN GROUP (ORDER BY kv.score) as q1Val',\n 'PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY kv.score) as medVal',\n 'PERCENTILE_CONT(0.75) WITHIN GROUP (ORDER BY kv.score) as q3Val',\n 'MAX(kv.score) as maxVal',\n 'AVG(kv.score) as avgVal',\n 'COUNT(DISTINCT p.id) as projectCount'\n ])\n .innerJoin('kpis', 'k', 'kv.kpi_id = k.id')\n .innerJoin('projects', 'p', 'kv.kpi_org_scope_id = p.id')\n .where('k.name LIKE :pattern', { pattern: 'Y%' })\n .andWhere('p.end_date IS NOT NULL')\n .andWhere('p.geo_group IS NOT NULL')\n .andWhere('kv.domain_id IN (:...domainIds)', { domainIds: await getDomainIdsWithAncestors(domain) })\n\n // 기간 필터\n if (startYearMonth && startYearMonth.trim() !== '') {\n queryBuilder.andWhere(`LEFT(kv.value_date, 7) >= :startYearMonth`, { startYearMonth })\n }\n if (endYearMonth && endYearMonth.trim() !== '') {\n queryBuilder.andWhere(`LEFT(kv.value_date, 7) <= :endYearMonth`, { endYearMonth })\n }\n\n queryBuilder\n .andWhere(\n `CASE\n WHEN p.geo_group IN ('01','02','03','04','05','06','07','08') THEN '서울특별시'\n WHEN p.geo_group IN ('46','47','48','49') THEN '부산광역시'\n WHEN p.geo_group IN ('41','42','43') THEN '대구광역시'\n WHEN p.geo_group IN ('21','22','23') THEN '인천광역시'\n WHEN p.geo_group IN ('61','62') THEN '광주광역시'\n WHEN p.geo_group IN ('34','35') THEN '대전광역시'\n WHEN p.geo_group IN ('44','45') THEN '울산광역시'\n WHEN p.geo_group = '30' THEN '세종특별자치시'\n WHEN p.geo_group IN ('10','11','12','13','14','15','16','17','18') THEN '경기도'\n WHEN p.geo_group IN ('24','25','26','33') THEN '강원도'\n WHEN p.geo_group IN ('27','28','29') THEN '충청북도'\n WHEN p.geo_group IN ('31','32') THEN '충청남도'\n WHEN p.geo_group IN ('54','55','56') THEN '전라북도'\n WHEN p.geo_group IN ('57','58','59') THEN '전라남도'\n WHEN p.geo_group IN ('36','37','38','39','40') THEN '경상북도'\n WHEN p.geo_group IN ('50','51','52','53') THEN '경상남도'\n WHEN p.geo_group = '63' THEN '제주특별자치도'\n END = :metroArea`,\n { metroArea }\n )\n .groupBy('k.name')\n .orderBy('k.name', 'ASC')\n\n const results = await queryBuilder.getRawMany()\n\n return results.map(result => {\n const kpiName = result.kpiname\n const minVal = Math.min(Math.max(Number(result.minval), 0), 1)\n const q1Val = Math.min(Math.max(Number(result.q1val), 0), 1)\n const medVal = Math.min(Math.max(Number(result.medval), 0), 1)\n const q3Val = Math.min(Math.max(Number(result.q3val), 0), 1)\n const avgVal = Math.min(Math.max(Number(result.avgval), 0), 1)\n const maxVal = Math.min(Math.max(Number(result.maxval), 0), 1)\n const projectCount = Number(result.projectcount)\n\n return {\n kpiName: kpiName,\n minVal: isNaN(minVal) ? 0 : minVal,\n q1Val: isNaN(q1Val) ? 0 : q1Val,\n medVal: isNaN(medVal) ? 0 : medVal,\n q3Val: isNaN(q3Val) ? 0 : q3Val,\n maxVal: isNaN(maxVal) ? 0 : maxVal,\n avgVal: isNaN(avgVal) ? 0 : avgVal,\n projectCount: isNaN(projectCount) ? 0 : projectCount\n }\n })\n }\n}\n"]}
|