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" """)