From 7d9982d5663bd104f67df89c6c31c060eb754842 Mon Sep 17 00:00:00 2001 From: zio Date: Fri, 24 Jul 2026 07:43:42 +0900 Subject: [PATCH] fix(dashboard): KPI booth/design counts scoped to current working layout only Proposal persistence (layout versions incl status=proposal) inflated booth KPI to 1589/600 - count only latest non-proposal version per hall. Co-Authored-By: Claude Fable 5 --- .../kintex/dashboard/DashboardMapper.java | 21 +++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/src/backend/src/main/java/com/zioinfo/kintex/dashboard/DashboardMapper.java b/src/backend/src/main/java/com/zioinfo/kintex/dashboard/DashboardMapper.java index 446bf2e..c9ccb29 100644 --- a/src/backend/src/main/java/com/zioinfo/kintex/dashboard/DashboardMapper.java +++ b/src/backend/src/main/java/com/zioinfo/kintex/dashboard/DashboardMapper.java @@ -23,18 +23,31 @@ public interface DashboardMapper { """) Map findEventHeader(@Param("eventId") String eventId); - /** KPI 원자 집계(단일 행) — 부스 수·목표 부스·설계 승인·유틸리티 신청·렌더 완료. */ + /** KPI 원자 집계(단일 행) — 부스 수·목표 부스·설계 승인·유틸리티 신청·렌더 완료. + * ★부스류 집계는 홀별 "현재 작업본"(proposal 제외 최신 버전) 레이아웃만 — 배치안(proposal) + * 영속화·버전 누적으로 전 버전 booth 를 합산하면 KPI 가 부풀려진다(1589/600 사고, 2026-07-24). */ @Select(""" SELECT (SELECT count(*) FROM booth b JOIN layout l ON l.id = b.layout_id - WHERE l.event_id = #{eventId}) AS "boothCount", + WHERE l.event_id = #{eventId} AND l.status != 'proposal' + AND l.version = (SELECT max(l2.version) FROM layout l2 + WHERE l2.event_id = l.event_id AND l2.hall_id = l.hall_id + AND l2.status != 'proposal')) AS "boothCount", (SELECT COALESCE(sum(h.booth_capacity), 0) FROM hall_assignment ha JOIN hall h ON h.id = ha.hall_id WHERE ha.event_id = #{eventId}) AS "targetBooths", (SELECT count(*) FROM booth b JOIN layout l ON l.id = b.layout_id JOIN design_plan dp ON dp.booth_id = b.id - WHERE l.event_id = #{eventId} AND dp.status = 'approved') AS "designApproved", + WHERE l.event_id = #{eventId} AND dp.status = 'approved' + AND l.status != 'proposal' + AND l.version = (SELECT max(l2.version) FROM layout l2 + WHERE l2.event_id = l.event_id AND l2.hall_id = l.hall_id + AND l2.status != 'proposal')) AS "designApproved", (SELECT count(*) FROM design_plan dp JOIN booth b ON b.id = dp.booth_id - JOIN layout l ON l.id = b.layout_id WHERE l.event_id = #{eventId}) AS "designTotal", + JOIN layout l ON l.id = b.layout_id WHERE l.event_id = #{eventId} + AND l.status != 'proposal' + AND l.version = (SELECT max(l2.version) FROM layout l2 + WHERE l2.event_id = l.event_id AND l2.hall_id = l.hall_id + AND l2.status != 'proposal')) AS "designTotal", (SELECT count(*) FROM utility_order u WHERE u.event_id = #{eventId}) AS "utilityOrders", (SELECT count(*) FROM render_job r WHERE r.event_id = #{eventId} AND r.status = 'DONE') AS "renderDone" """)