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 <noreply@anthropic.com>
This commit is contained in:
zio 2026-07-24 07:43:42 +09:00
parent 933fb613c6
commit 7d9982d566

View File

@ -23,18 +23,31 @@ public interface DashboardMapper {
""") """)
Map<String, Object> findEventHeader(@Param("eventId") String eventId); Map<String, Object> findEventHeader(@Param("eventId") String eventId);
/** KPI 원자 집계(단일 행) — 부스 수·목표 부스·설계 승인·유틸리티 신청·렌더 완료. */ /** KPI 원자 집계(단일 ) 부스 ·목표 부스·설계 승인·유틸리티 신청·렌더 완료.
* 부스류 집계는 홀별 "현재 작업본"(proposal 제외 최신 버전) 레이아웃만 배치안(proposal)
* 영속화·버전 누적으로 버전 booth 합산하면 KPI 부풀려진다(1589/600 사고, 2026-07-24). */
@Select(""" @Select("""
SELECT SELECT
(SELECT count(*) FROM booth b JOIN layout l ON l.id = b.layout_id (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 (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", 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 (SELECT count(*) FROM booth b JOIN layout l ON l.id = b.layout_id
JOIN design_plan dp ON dp.booth_id = b.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 (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 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" (SELECT count(*) FROM render_job r WHERE r.event_id = #{eventId} AND r.status = 'DONE') AS "renderDone"
""") """)