Files
ai_platform/views/partials/mgmt_perf_dashboard_container.ejs
dsyoon fdcf1e0528 feat: 경영성과 대시보드 DB·엑셀 업로드·HTML 차트 연동
- mgmt_perf_uploads / mgmt_perf_snapshots 스키마
- POST /api/mgmt-perf/upload, 기본 페이로드 data/mgmt-perf-default-payload.json
- 대시보드 페이지: 업로드 영역 + iframe embed
- public/mgmt-perf: 원본 HTML 기반 CSS·dashboard-app.js
- xlsx 미설치 시 기본 페이로드+메타만 저장

Made-with: Cursor
2026-04-13 13:21:31 +09:00

267 lines
14 KiB
Plaintext

<div class="container">
<div class="header">
<h1><%= typeof dashboardTitle !== 'undefined' ? dashboardTitle : '경영성과 대시보드' %></h1>
<p>실시간 성과 분석 및 사업본부별 상세 현황</p>
</div>
<!-- Slicers Container -->
<div class="slicers-container">
<div class="slicer-group">
<div class="slicer-label">사업본부 (Division)</div>
<div class="slicer-tabs" id="divisionSlicer">
<button class="slicer-tab active" data-division="all">전체</button>
<button class="slicer-tab" data-division="fscan">FSCAN국내</button>
<button class="slicer-tab" data-division="fscanovs">FSCAN해외</button>
<button class="slicer-tab" data-division="xscan">XSCAN국내</button>
<button class="slicer-tab" data-division="xscanovs">XSCAN해외</button>
<button class="slicer-tab" data-division="battery">배터리</button>
<button class="slicer-tab" data-division="newbiz">신사업</button>
</div>
</div>
<div class="slicer-group">
<div class="slicer-label">월별 (Month)</div>
<div class="slicer-tabs" id="monthSlicer">
<button class="slicer-tab active" data-month="all"><%= typeof quarterLabel !== 'undefined' ? quarterLabel : 'Q1' %> 전체</button>
<button class="slicer-tab" data-month="1">1월</button>
<button class="slicer-tab" data-month="2">2월</button>
<button class="slicer-tab" data-month="3">3월</button>
</div>
</div>
</div>
<!-- Section Tabs -->
<div class="section-tabs">
<button class="section-tab-btn active" data-section="매출현황">매출현황</button>
<button class="section-tab-btn" data-section="수주현황">수주현황</button>
<button class="section-tab-btn" data-section="예상전망">예상실적</button>
</div>
<!-- Content Area -->
<div class="content">
<!-- 매출현황 Section -->
<div id="매출현황" class="section active">
<!-- Overview Mode -->
<div id="overviewMode">
<div class="kpi-grid" id="overviewKpis"></div>
<div class="chart-row">
<div class="chart-container">
<div class="chart-title">월별 매출 추이</div>
<div class="chart-wrapper">
<canvas id="monthlyTrendChart"></canvas>
</div>
</div>
<div class="chart-container">
<div class="chart-title">사업본부별 매출 현황</div>
<div class="chart-wrapper">
<canvas id="divisionSalesChart"></canvas>
</div>
</div>
</div>
<div class="chart-row">
<div class="chart-container">
<div class="chart-title">목표 대비 실적</div>
<div class="chart-wrapper">
<canvas id="targetVsActualChart"></canvas>
</div>
</div>
<div class="chart-container">
<div class="chart-title">사업본부별 목표달성률</div>
<div class="chart-wrapper">
<canvas id="achievementRateChart"></canvas>
</div>
</div>
</div>
</div>
<!-- Division Detail Mode -->
<div id="divisionDetailMode" style="display:none;">
<div class="kpi-grid" id="divisionDetailKpis"></div>
<div class="chart-row">
<div class="chart-container">
<div class="chart-title">월별 매출 추이</div>
<div class="chart-wrapper">
<canvas id="divisionMonthlyChart"></canvas>
</div>
</div>
<div class="chart-container">
<div class="chart-title">매출비중 (Top Customers)</div>
<div class="chart-wrapper">
<canvas id="customerShareChart"></canvas>
</div>
</div>
</div>
<div class="table-wrapper">
<div class="table-title">주요 고객사 현황</div>
<table id="customerTable">
<thead>
<tr>
<th style="width: 40px;">순위</th>
<th style="width: 200px;">고객사명</th>
<th style="width: 80px;">구분</th>
<th style="width: 100px;">매출유형</th>
<th style="width: 120px;">매출액</th>
<th style="width: 80px;">비중(%)</th>
<th style="width: 120px;">미발행잔액</th>
</tr>
</thead>
<tbody></tbody>
</table>
</div>
<!-- 미수채권 Section -->
<div class="risk-section">
<div class="risk-title">미수채권 (세금계산서 미발행 리스크)</div>
<div style="margin-bottom: 30px;">
<div class="risk-label">총 미발행 잔액</div>
<div class="risk-value" id="divisionRiskTotal">0</div>
</div>
<div class="chart-container" style="margin-bottom: 0;">
<div class="chart-title">고객사별 미발행금액</div>
<div class="chart-wrapper">
<canvas id="riskByCustomerChart"></canvas>
</div>
</div>
</div>
<div class="table-wrapper">
<div class="table-title">미수채권 상세현황</div>
<table id="riskDetailTable">
<thead>
<tr>
<th style="width: 60px;">월</th>
<th style="width: 180px;">사업본부</th>
<th style="width: 180px;">고객사</th>
<th style="width: 150px;">제품</th>
<th style="width: 120px;">미발행금액</th>
</tr>
</thead>
<tbody></tbody>
</table>
</div>
</div>
<!-- Sales Category Breakdown -->
<div class="chart-row" id="salesCatRow">
<div class="chart-container">
<div class="chart-title" id="salesCatTitle">매출유형별 비중</div>
<div class="chart-wrapper">
<canvas id="salesCatChart"></canvas>
</div>
</div>
<div class="chart-container">
<div class="chart-title" id="salesCatBarTitle">매출유형별 금액 (단위: 억원)</div>
<div class="chart-wrapper">
<canvas id="salesCatBarChart"></canvas>
</div>
</div>
</div>
<!-- Model Rankings (FSCAN/XSCAN only) -->
<div class="chart-row" id="salesModelRow">
<div class="chart-container">
<div class="chart-title" id="fscanSalesModelTitle">FSCAN 주요 모델별 매출 Top 5</div>
<div class="chart-wrapper">
<canvas id="fscanModelChart"></canvas>
</div>
</div>
<div class="chart-container">
<div class="chart-title" id="xscanSalesModelTitle">XSCAN 주요 모델별 매출 Top 5</div>
<div class="chart-wrapper">
<canvas id="xscanModelChart"></canvas>
</div>
</div>
</div>
</div>
<!-- 수주현황 Section -->
<div id="수주현황" class="section">
<div class="kpi-grid" id="orderKpis"></div>
<div class="chart-row">
<div class="chart-container">
<div class="chart-title">월별 수주 현황 (단위: 억원)</div>
<div class="chart-wrapper">
<canvas id="orderMonthlyChart"></canvas>
</div>
</div>
<div class="chart-container">
<div class="chart-title">사업본부별 수주 실적</div>
<div class="chart-wrapper">
<canvas id="orderByDivisionChart"></canvas>
</div>
</div>
</div>
<div class="chart-row">
<div class="chart-container">
<div class="chart-title" id="orderCatTitle">수주유형별 비중</div>
<div class="chart-wrapper">
<canvas id="orderCatChart"></canvas>
</div>
</div>
<div class="chart-container">
<div class="chart-title" id="orderCatBarTitle">수주유형별 금액 (단위: 억원)</div>
<div class="chart-wrapper">
<canvas id="orderCatBarChart"></canvas>
</div>
</div>
</div>
<div class="chart-row" id="orderModelRow">
<div class="chart-container">
<div class="chart-title" id="fscanOrderModelTitle">FSCAN 주요 모델별 수주</div>
<div class="chart-wrapper">
<canvas id="fscanOrderModelChart"></canvas>
</div>
</div>
<div class="chart-container">
<div class="chart-title" id="xscanOrderModelTitle">XSCAN 주요 모델별 수주</div>
<div class="chart-wrapper">
<canvas id="xscanOrderModelChart"></canvas>
</div>
</div>
</div>
<div class="table-wrapper">
<div class="table-title">사업본부별 월별 수주 현황 (단위: 억원)</div>
<table id="orderDetailTable">
<thead>
<tr>
<th>사업본부</th>
<th style="text-align: right;">1월</th>
<th style="text-align: right;">2월</th>
<th style="text-align: right;">3월</th>
<th style="text-align: right;">합계</th>
<th style="text-align: right;">계획</th>
<th style="text-align: right;">달성률</th>
</tr>
</thead>
<tbody></tbody>
</table>
</div>
</div>
<!-- 예상전망 Section -->
<div id="예상전망" class="section">
<div class="kpi-grid" id="forecastKpis"></div>
<div class="chart-container">
<div class="chart-title">3개월 예상실적 (단위: 억원)</div>
<div class="chart-wrapper">
<canvas id="annualForecastChart"></canvas>
</div>
</div>
<div class="table-wrapper">
<div class="table-title">월별 전망치</div>
<table id="forecastTable">
<thead>
<tr>
<th style="width: 100px;">월</th>
<th style="width: 150px;">계획(억원)</th>
<th style="width: 150px;">손익분기점(억원)</th>
<th style="width: 150px;">실적(억원)</th>
<th style="width: 100px;">달성률</th>
</tr>
</thead>
<tbody></tbody>
</table>
</div>
</div>
</div>
</div>