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);
/** 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"
""")