Files
LLZQ-XCX/Prototype/pages/board-finance.html
2026-02-05 03:35:07 +08:00

1637 lines
85 KiB
HTML
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>看板-财务 - 球房运营助手</title>
<script src="https://cdn.tailwindcss.com"></script>
<link href="https://fonts.googleapis.com/css2?family=Noto+Sans+SC:wght@300;400;500;600;700&display=swap" rel="stylesheet">
<script>
tailwind.config = {
theme: {
extend: {
colors: {
primary: '#0052d9',
'primary-light': '#ecf2fe',
success: '#00a870',
warning: '#ed7b2f',
error: '#e34d59',
'gray-1': '#f3f3f3',
'gray-2': '#eeeeee',
'gray-3': '#e7e7e7',
'gray-4': '#dcdcdc',
'gray-5': '#c5c5c5',
'gray-6': '#a6a6a6',
'gray-7': '#8b8b8b',
'gray-8': '#777777',
'gray-9': '#5e5e5e',
'gray-10': '#4b4b4b',
'gray-11': '#393939',
'gray-12': '#2c2c2c',
'gray-13': '#242424',
},
fontFamily: {
sans: ['Noto Sans SC', 'sans-serif'],
}
}
}
}
</script>
<style>
body {
font-family: 'Noto Sans SC', -apple-system, BlinkMacSystemFont, sans-serif;
padding-bottom: 280px;
}
.safe-area-top {
padding-top: env(safe-area-inset-top, 44px);
}
.tab-active {
color: #0052d9;
position: relative;
}
.tab-active::after {
content: '';
position: absolute;
bottom: 0;
left: 50%;
transform: translateX(-50%);
width: 24px;
height: 3px;
background: linear-gradient(90deg, #0052d9, #5b9cf8);
border-radius: 2px;
}
.filter-overlay {
display: none;
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: rgba(0, 0, 0, 0.5);
z-index: 1000;
}
.filter-overlay.show {
display: block;
}
.filter-dropdown {
display: none;
position: fixed;
left: 0;
right: 0;
background: white;
border-radius: 0 0 16px 16px;
box-shadow: 0 8px 24px rgba(0,0,0,0.15);
z-index: 1001;
max-height: 60vh;
overflow-y: auto;
}
.filter-dropdown.show {
display: block;
}
#filterBar {
overflow: hidden;
max-height: 120px;
transition: transform 220ms ease, opacity 220ms ease, max-height 220ms ease;
will-change: transform, opacity;
}
#filterBar.filter-bar-enter {
transform: translateY(-16px);
opacity: 0;
}
#filterBar.filter-bar-hidden {
opacity: 0;
transform: translateY(-110%);
pointer-events: none;
}
@media (prefers-reduced-motion: reduce) {
#filterBar { animation: none; transition: none; }
}
.summary-gradient {
background: linear-gradient(135deg, #1a1a2e 0%, #16213e 50%, #0f3460 100%);
}
/* 对比开关样式 */
.compare-toggle {
width: 44px;
height: 24px;
background: #dcdcdc;
border-radius: 12px;
position: relative;
cursor: pointer;
transition: background 0.3s;
}
.compare-toggle.active {
background: #0052d9;
}
.compare-toggle::after {
content: '';
position: absolute;
width: 20px;
height: 20px;
background: white;
border-radius: 50%;
top: 2px;
left: 2px;
transition: left 0.3s;
box-shadow: 0 2px 4px rgba(0,0,0,0.2);
}
.compare-toggle.active::after {
left: 22px;
}
/* 对比数据样式 - 最小字体12px */
.compare-data {
display: none;
font-size: 12px;
margin-top: 2px;
}
.compare-data.show {
display: flex;
align-items: center;
justify-content: center;
gap: 2px;
}
.compare-up {
color: #e34d59;
}
.compare-down {
color: #00a870;
}
/* 提示弹窗遮罩 */
.tip-overlay {
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: rgba(0, 0, 0, 0.3);
z-index: 1999;
opacity: 0;
visibility: hidden;
transition: all 0.3s ease;
}
.tip-overlay.show {
opacity: 1;
visibility: visible;
}
/* 提示弹窗样式 */
.tip-toast {
position: fixed;
bottom: 100px;
left: 16px;
right: 16px;
background: white;
border-radius: 12px;
padding: 16px;
box-shadow: 0 8px 32px rgba(0,0,0,0.25), 0 2px 8px rgba(0,0,0,0.15);
z-index: 2000;
transform: translateY(120%);
opacity: 0;
transition: all 0.3s ease;
}
.tip-toast.show {
transform: translateY(0);
opacity: 1;
}
.tip-toast-content {
font-size: 13px;
color: #4b4b4b;
line-height: 1.6;
white-space: pre-wrap;
}
.tip-toast-content strong {
color: #242424;
font-weight: 600;
}
/* 问号图标样式 */
.help-icon {
display: inline-flex;
align-items: center;
justify-content: center;
width: 16px;
height: 16px;
background: rgba(255,255,255,0.2);
border-radius: 50%;
font-size: 10px;
color: rgba(255,255,255,0.7);
cursor: pointer;
margin-left: 4px;
flex-shrink: 0;
}
.help-icon-dark {
background: rgba(0,0,0,0.08);
color: #777777;
}
/* 卡片标题样式 */
.card-section-title {
font-size: 13px;
font-weight: 600;
color: #393939;
margin-bottom: 12px;
}
/* 优惠流程样式 */
.flow-item {
display: flex;
align-items: center;
padding: 10px 0;
border-bottom: 1px solid #f3f3f3;
}
.flow-item:last-child {
border-bottom: none;
}
.flow-dot {
width: 8px;
height: 8px;
border-radius: 50%;
margin-right: 12px;
flex-shrink: 0;
}
.flow-line {
width: 2px;
height: 16px;
background: #e7e7e7;
margin-left: 3px;
margin-top: -10px;
margin-bottom: -10px;
}
/* 赠送卡行样式 */
.gift-row {
display: flex;
justify-content: space-between;
align-items: center;
padding: 14px 16px;
background: #fafafa;
border-radius: 12px;
margin-bottom: 10px;
}
.gift-row:last-child {
margin-bottom: 0;
}
.gift-tag {
display: inline-flex;
align-items: center;
padding: 3px 8px;
border-radius: 4px;
font-size: 11px;
margin-left: 6px;
}
.gift-tag-wine { background: #fef3f2; color: #dc2626; }
.gift-tag-table { background: #f0fdf4; color: #16a34a; }
.gift-tag-coupon { background: #eff6ff; color: #2563eb; }
</style>
</head>
<body class="bg-gray-1 min-h-screen">
<!-- 顶部导航 -->
<div class="safe-area-top bg-white sticky top-0 z-20 shadow-sm">
<div class="h-11 flex items-center justify-center relative border-b border-gray-2">
<h1 class="text-base font-medium text-gray-13">看板</h1>
</div>
<!-- 一级 Tab -->
<div class="flex">
<a href="board-finance.html" class="flex-1 py-3 text-center text-sm font-medium tab-active">财务</a>
<a href="board-customer.html" class="flex-1 py-3 text-center text-sm font-medium text-gray-7">客户</a>
<a href="board-coach.html" class="flex-1 py-3 text-center text-sm font-medium text-gray-7">助教</a>
</div>
</div>
<!-- 筛选区域 -->
<div id="filterBar" class="bg-gray-1 sticky top-[88px] z-10 px-4 py-2 border-b border-gray-2">
<div class="bg-white rounded-2xl p-1.5 flex gap-2 shadow-sm border border-gray-2">
<button onclick="toggleFilter('time')" class="flex-1 px-3 py-2 bg-primary-light rounded-lg text-sm text-primary flex items-center justify-center gap-1 border border-primary/20">
<span id="timeLabel">本月</span>
<svg class="w-4 h-4 text-primary" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
<polyline points="6 9 12 15 18 9"/>
</svg>
</button>
<button onclick="toggleFilter('area')" class="flex-1 px-3 py-2 bg-gray-50 rounded-lg text-sm text-gray-10 flex items-center justify-center gap-1 border border-gray-100">
<span id="areaLabel">全部区域</span>
<svg class="w-4 h-4 text-gray-5" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
<polyline points="6 9 12 15 18 9"/>
</svg>
</button>
<!-- 环比开关 -->
<div class="flex items-center gap-2 px-2">
<span class="text-xs text-gray-7">环比</span>
<div id="compareToggle" class="compare-toggle" onclick="toggleCompare()"></div>
</div>
</div>
</div>
<!-- 遮罩层 -->
<div id="filterOverlay" class="filter-overlay" onclick="closeAllFilters()"></div>
<!-- 时间筛选弹窗 -->
<div id="timeDropdown" class="filter-dropdown">
<div class="p-4 space-y-2">
<div class="px-4 py-3 text-sm text-gray-10 hover:bg-primary/5 rounded-lg cursor-pointer flex items-center justify-between" onclick="selectTime('本月')">
<span>本月</span>
</div>
<div class="px-4 py-3 text-sm text-gray-10 hover:bg-primary/5 rounded-lg cursor-pointer flex items-center justify-between" onclick="selectTime('上个月')">
<span>上个月</span>
</div>
<div class="px-4 py-3 text-sm text-gray-10 hover:bg-primary/5 rounded-lg cursor-pointer flex items-center justify-between" onclick="selectTime('最近3个月')">
<span>最近3个月</span>
</div>
<div class="px-4 py-3 text-sm text-gray-10 hover:bg-primary/5 rounded-lg cursor-pointer flex items-center justify-between" onclick="selectTime('最近半年')">
<span>最近半年</span>
</div>
<div class="px-4 py-3 text-sm text-gray-10 hover:bg-primary/5 rounded-lg cursor-pointer flex items-center justify-between" onclick="selectTime('本季度')">
<span>本季度</span>
</div>
<div class="px-4 py-3 text-sm text-gray-10 hover:bg-primary/5 rounded-lg cursor-pointer flex items-center justify-between" onclick="selectTime('上个季度')">
<span>上个季度</span>
</div>
<div class="px-4 py-3 text-sm text-gray-10 hover:bg-primary/5 rounded-lg cursor-pointer flex items-center justify-between" onclick="selectTime('本周')">
<span>本周</span>
</div>
<div class="px-4 py-3 text-sm text-gray-10 hover:bg-primary/5 rounded-lg cursor-pointer flex items-center justify-between" onclick="selectTime('上周')">
<span>上周</span>
</div>
</div>
</div>
<!-- 区域筛选弹窗 -->
<div id="areaDropdown" class="filter-dropdown">
<div class="p-4 space-y-2">
<div class="px-4 py-3 text-sm text-gray-10 hover:bg-primary/5 rounded-lg cursor-pointer" onclick="selectArea('全部区域')">全部区域</div>
<div class="px-4 py-3 text-sm text-gray-10 hover:bg-primary/5 rounded-lg cursor-pointer font-medium" onclick="selectArea('大厅')">大厅</div>
<div class="px-4 py-3 text-sm text-gray-7 hover:bg-primary/5 rounded-lg cursor-pointer pl-8" onclick="selectArea('A区')">A区</div>
<div class="px-4 py-3 text-sm text-gray-7 hover:bg-primary/5 rounded-lg cursor-pointer pl-8" onclick="selectArea('B区')">B区</div>
<div class="px-4 py-3 text-sm text-gray-7 hover:bg-primary/5 rounded-lg cursor-pointer pl-8" onclick="selectArea('C区')">C区</div>
<div class="px-4 py-3 text-sm text-gray-10 hover:bg-primary/5 rounded-lg cursor-pointer font-medium" onclick="selectArea('麻将房')">麻将房</div>
<div class="px-4 py-3 text-sm text-gray-10 hover:bg-primary/5 rounded-lg cursor-pointer font-medium" onclick="selectArea('团建房')">团建房</div>
</div>
</div>
<!-- 经营状况一览 (黑色Banner) -->
<div class="summary-gradient mx-4 mt-4 rounded-2xl p-5 text-white">
<h3 class="text-sm font-medium text-white/80 mb-4">经营状况一览</h3>
<!-- 收入概览(经营链) -->
<div class="mb-4">
<p class="text-xs text-white/50 mb-3">收入概览(经营链)</p>
<!-- 第一行:发生额、总优惠、优惠占比 - 上下结构 -->
<div class="grid grid-cols-3 gap-3 mb-3">
<div class="text-center">
<div class="flex items-center justify-center mb-1">
<p class="text-white/60 text-xs">发生额/正价</p>
<span class="help-icon" onclick="showTip('occurrence')">?</span>
</div>
<p class="text-xl font-bold text-white">¥823,456</p>
<div class="compare-data compare-up" data-compare>
<svg class="w-3 h-3" viewBox="0 0 24 24" fill="currentColor"><path d="M12 4l-8 8h5v8h6v-8h5z"/></svg>
<span>+12.5%</span>
</div>
</div>
<div class="text-center">
<div class="flex items-center justify-center mb-1">
<p class="text-white/60 text-xs">总优惠</p>
<span class="help-icon" onclick="showTip('discount')">?</span>
</div>
<p class="text-xl font-bold text-amber-400">-¥113,336</p>
<div class="compare-data compare-down" data-compare>
<svg class="w-3 h-3" viewBox="0 0 24 24" fill="currentColor"><path d="M12 20l8-8h-5V4H9v8H4z"/></svg>
<span>-3.2%</span>
</div>
</div>
<div class="text-center">
<div class="flex items-center justify-center mb-1">
<p class="text-white/60 text-xs">优惠占比</p>
</div>
<p class="text-xl font-bold text-amber-400">13.8%</p>
<div class="compare-data compare-down" data-compare>
<svg class="w-3 h-3" viewBox="0 0 24 24" fill="currentColor"><path d="M12 20l8-8h-5V4H9v8H4z"/></svg>
<span>-1.5%</span>
</div>
</div>
</div>
<!-- 第二行:成交/确认收入 - 左右结构 -->
<div class="bg-white/10 rounded-xl px-4 py-3 flex justify-between items-center">
<div class="flex items-center">
<p class="text-white/70 text-sm">成交/确认收入</p>
<span class="help-icon" onclick="showTip('confirmed')">?</span>
</div>
<div class="flex items-center gap-3">
<p class="text-xl font-bold text-green-400">¥710,120</p>
<div class="compare-data compare-up" data-compare>
<svg class="w-3 h-3" viewBox="0 0 24 24" fill="currentColor"><path d="M12 4l-8 8h5v8h6v-8h5z"/></svg>
<span>+8.7%</span>
</div>
</div>
</div>
</div>
<div class="border-t border-white/10 my-4"></div>
<!-- 现金概览 - 2x2结构 -->
<div>
<p class="text-xs text-white/50 mb-3">现金概览 <span class="text-white/30">(往期为已结算,本期为预估)</span></p>
<div class="grid grid-cols-2 gap-3">
<!-- 第一行 -->
<div class="bg-white/5 rounded-xl p-3 text-center">
<div class="flex items-center justify-center mb-1">
<p class="text-white/60 text-xs">实收/现金流入</p>
<span class="help-icon" onclick="showTip('cashIn')">?</span>
</div>
<p class="text-lg font-bold text-green-400">¥698,500</p>
<div class="compare-data compare-up" data-compare>
<svg class="w-3 h-3" viewBox="0 0 24 24" fill="currentColor"><path d="M12 4l-8 8h5v8h6v-8h5z"/></svg>
<span>+5.3%</span>
</div>
</div>
<div class="bg-white/5 rounded-xl p-3 text-center">
<div class="flex items-center justify-center mb-1">
<p class="text-white/60 text-xs">现金支出</p>
<span class="help-icon" onclick="showTip('cashOut')">?</span>
</div>
<p class="text-lg font-bold text-rose-400">¥472,300</p>
<div class="compare-data compare-up" data-compare>
<svg class="w-3 h-3" viewBox="0 0 24 24" fill="currentColor"><path d="M12 4l-8 8h5v8h6v-8h5z"/></svg>
<span>+2.1%</span>
</div>
</div>
<!-- 第二行 -->
<div class="bg-white/5 rounded-xl p-3 text-center">
<div class="flex items-center justify-center mb-1">
<p class="text-white/60 text-xs">现金结余</p>
<span class="help-icon" onclick="showTip('balance')">?</span>
</div>
<p class="text-lg font-bold text-blue-400">¥226,200</p>
<div class="compare-data compare-up" data-compare>
<svg class="w-3 h-3" viewBox="0 0 24 24" fill="currentColor"><path d="M12 4l-8 8h5v8h6v-8h5z"/></svg>
<span>+15.2%</span>
</div>
</div>
<div class="bg-white/5 rounded-xl p-3 text-center">
<div class="flex items-center justify-center mb-1">
<p class="text-white/60 text-xs">结余率</p>
</div>
<p class="text-lg font-bold text-blue-400">32.4%</p>
<div class="compare-data compare-up" data-compare>
<svg class="w-3 h-3" viewBox="0 0 24 24" fill="currentColor"><path d="M12 4l-8 8h5v8h6v-8h5z"/></svg>
<span>+3.8%</span>
</div>
</div>
</div>
</div>
</div>
<!-- AI分析 -->
<div class="mx-4 mt-4 bg-gradient-to-r from-indigo-500/10 to-purple-500/10 rounded-2xl p-4 border border-indigo-200/50">
<div class="flex items-center gap-2 mb-3">
<div class="w-7 h-7 bg-gradient-to-br from-indigo-500 via-purple-500 to-pink-400 rounded-full flex items-center justify-center shadow-sm">
<svg width="18" height="18" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<!-- 机器人头部 -->
<rect x="5" y="7" width="14" height="12" rx="4" fill="white"/>
<!-- 天线 -->
<path d="M12 7V4" stroke="white" stroke-width="2" stroke-linecap="round"/>
<circle cx="12" cy="3" r="1.5" fill="white"/>
<!-- 眼睛 -->
<circle cx="9" cy="11.5" r="2" fill="#667eea"/>
<circle cx="15" cy="11.5" r="2" fill="#667eea"/>
<!-- 眼睛高光 -->
<circle cx="9.5" cy="11" r="0.7" fill="white"/>
<circle cx="15.5" cy="11" r="0.7" fill="white"/>
<!-- 微笑嘴巴 -->
<path d="M9.5 15C10 16 14 16 14.5 15" stroke="#667eea" stroke-width="1.5" stroke-linecap="round"/>
<!-- 腮红 -->
<circle cx="7" cy="13.5" r="1" fill="#f5a0c0" opacity="0.6"/>
<circle cx="17" cy="13.5" r="1" fill="#f5a0c0" opacity="0.6"/>
<!-- 耳朵/装饰 -->
<rect x="3" y="10" width="2" height="4" rx="1" fill="white"/>
<rect x="19" y="10" width="2" height="4" rx="1" fill="white"/>
</svg>
</div>
<h3 class="text-sm font-semibold text-gray-13">AI 财务分析</h3>
</div>
<div class="space-y-2 text-sm text-gray-9">
<p><strong class="text-gray-11">优惠率Top</strong>团购(5.2%) / 大客户(3.1%) / 赠送卡(2.5%)</p>
<p><strong class="text-gray-11">差异最大项目:</strong>酒水(+18%) / 台桌(-5%) / 包厢(+12%)</p>
<p><strong class="text-gray-11">财务分析:</strong><span class="text-warning">充值高但消耗低</span>,建议关注会员活跃度</p>
</div>
</div>
<!-- 指标内容 -->
<div class="p-4 space-y-4">
<!-- 充值与预收 -->
<div class="bg-white rounded-2xl p-4 shadow-sm">
<div class="flex items-center gap-2 mb-4">
<span class="w-2 h-2 rounded-full bg-primary"></span>
<h2 class="text-base font-semibold text-gray-13">充值与预收</h2>
</div>
<!-- 会员卡概览 -->
<div class="mb-5">
<p class="card-section-title">会员卡概览</p>
<!-- 储值卡充值实收 -->
<div class="bg-gray-50 rounded-xl px-4 py-3 mb-3">
<div class="flex justify-between items-center mb-2">
<div class="flex items-center">
<p class="text-sm text-gray-9 font-medium">储值卡充值实收</p>
<span class="help-icon help-icon-dark" onclick="showTip('rechargeActual')">?</span>
</div>
<div class="text-right">
<p class="text-xl font-bold text-gray-13">¥352,800</p>
<div class="compare-data compare-up justify-end" data-compare>
<svg class="w-3 h-3" viewBox="0 0 24 24" fill="currentColor"><path d="M12 4l-8 8h5v8h6v-8h5z"/></svg>
<span>+18.5%</span>
</div>
</div>
</div>
<div class="flex gap-2 mt-2">
<div class="flex-1 bg-white rounded-lg px-3 py-2 flex justify-between items-center">
<span class="text-sm text-gray-7">首充</span>
<span class="text-base font-semibold text-gray-10">¥188,500</span>
</div>
<div class="flex-1 bg-white rounded-lg px-3 py-2 flex justify-between items-center">
<span class="text-sm text-gray-7">续费</span>
<span class="text-base font-semibold text-gray-10">¥164,300</span>
</div>
</div>
</div>
<!-- 全类别会员卡余额合计 -->
<div class="bg-amber-50 rounded-xl px-4 py-3 flex justify-between items-center">
<div>
<div class="flex items-center mb-1">
<p class="text-sm text-gray-9 font-medium">全类别会员卡余额合计</p>
<span class="help-icon help-icon-dark" onclick="showTip('allCardBalance')">?</span>
</div>
<span class="text-xs text-amber-600 bg-amber-100 px-2 py-0.5 rounded">仅经营参考,非财务属性</span>
</div>
<div class="text-right">
<p class="text-xl font-bold text-gray-13">¥586,500</p>
<div class="compare-data compare-up justify-end" data-compare>
<svg class="w-3 h-3" viewBox="0 0 24 24" fill="currentColor"><path d="M12 4l-8 8h5v8h6v-8h5z"/></svg>
<span>+6.2%</span>
</div>
</div>
</div>
</div>
<!-- 储值卡统计详情 -->
<div class="mb-5">
<p class="card-section-title">储值卡统计详情</p>
<div class="grid grid-cols-3 gap-1.5">
<div class="bg-gray-50 rounded-xl p-3 text-center">
<div class="flex items-center justify-center mb-1">
<p class="text-sm text-gray-8">充值</p>
<span class="help-icon help-icon-dark text-[10px]" onclick="showTip('recharge')">?</span>
</div>
<p class="text-xl font-bold text-gray-13">¥352,800</p>
<div class="compare-data compare-up" data-compare>
<svg class="w-3 h-3" viewBox="0 0 24 24" fill="currentColor"><path d="M12 4l-8 8h5v8h6v-8h5z"/></svg>
<span>+18.5%</span>
</div>
</div>
<div class="bg-gray-50 rounded-xl p-3 text-center">
<div class="flex items-center justify-center mb-1">
<p class="text-sm text-gray-8">消耗</p>
<span class="help-icon help-icon-dark text-[10px]" onclick="showTip('consume')">?</span>
</div>
<p class="text-xl font-bold text-gray-13">¥238,200</p>
<div class="compare-data compare-down" data-compare>
<svg class="w-3 h-3" viewBox="0 0 24 24" fill="currentColor"><path d="M12 20l8-8h-5V4H9v8H4z"/></svg>
<span>-5.3%</span>
</div>
</div>
<div class="bg-primary/5 rounded-xl p-3 text-center">
<div class="flex items-center justify-center mb-1">
<p class="text-sm text-gray-8">总余额</p>
<span class="help-icon help-icon-dark text-[10px]" onclick="showTip('cardBalance')">?</span>
</div>
<p class="text-xl font-bold text-primary">¥642,600</p>
<div class="compare-data compare-up" data-compare>
<svg class="w-3 h-3" viewBox="0 0 24 24" fill="currentColor"><path d="M12 4l-8 8h5v8h6v-8h5z"/></svg>
<span>+11.4%</span>
</div>
</div>
</div>
</div>
<!-- 赠送卡统计详情 -->
<div>
<p class="card-section-title">赠送卡统计详情</p>
<!-- 新增 -->
<div class="gift-row">
<div>
<div class="flex items-center mb-1">
<p class="text-sm text-gray-9 font-medium">赠送卡新增</p>
<span class="help-icon help-icon-dark text-[10px]" onclick="showTip('giftNew')">?</span>
</div>
<p class="text-xl font-bold text-gray-13">¥108,600</p>
<div class="compare-data compare-up" data-compare>
<svg class="w-3 h-3" viewBox="0 0 24 24" fill="currentColor"><path d="M12 4l-8 8h5v8h6v-8h5z"/></svg>
<span>+22.1%</span>
</div>
</div>
<div class="space-y-1.5 min-w-[140px]">
<div class="flex justify-between items-center bg-red-50 rounded-lg px-3 py-1.5">
<span class="text-sm text-red-600">酒水卡</span>
<span class="text-sm font-bold text-gray-13">¥43,200</span>
</div>
<div class="flex justify-between items-center bg-green-50 rounded-lg px-3 py-1.5">
<span class="text-sm text-green-600">台费卡</span>
<span class="text-sm font-bold text-gray-13">¥54,100</span>
</div>
<div class="flex justify-between items-center bg-blue-50 rounded-lg px-3 py-1.5">
<span class="text-sm text-blue-600">抵用券</span>
<span class="text-sm font-bold text-gray-13">¥11,300</span>
</div>
</div>
</div>
<!-- 消费 -->
<div class="gift-row">
<div>
<div class="flex items-center mb-1">
<p class="text-sm text-gray-9 font-medium">赠送卡消费</p>
<span class="help-icon help-icon-dark text-[10px]" onclick="showTip('giftConsume')">?</span>
</div>
<p class="text-xl font-bold text-gray-13">¥75,800</p>
<div class="compare-data compare-down" data-compare>
<svg class="w-3 h-3" viewBox="0 0 24 24" fill="currentColor"><path d="M12 20l8-8h-5V4H9v8H4z"/></svg>
<span>-8.7%</span>
</div>
</div>
<div class="space-y-1.5 min-w-[140px]">
<div class="flex justify-between items-center bg-red-50 rounded-lg px-3 py-1.5">
<span class="text-sm text-red-600">酒水卡</span>
<span class="text-sm font-bold text-gray-13">¥32,100</span>
</div>
<div class="flex justify-between items-center bg-green-50 rounded-lg px-3 py-1.5">
<span class="text-sm text-green-600">台费卡</span>
<span class="text-sm font-bold text-gray-13">¥32,800</span>
</div>
<div class="flex justify-between items-center bg-blue-50 rounded-lg px-3 py-1.5">
<span class="text-sm text-blue-600">抵用券</span>
<span class="text-sm font-bold text-gray-13">¥10,900</span>
</div>
</div>
</div>
<!-- 总余额 -->
<div class="gift-row bg-primary/5">
<div>
<div class="flex items-center mb-1">
<p class="text-sm text-gray-9 font-medium">赠送卡总余额</p>
<span class="help-icon help-icon-dark text-[10px]" onclick="showTip('giftBalance')">?</span>
</div>
<p class="text-xl font-bold text-primary">¥243,900</p>
<div class="compare-data compare-up" data-compare>
<svg class="w-3 h-3" viewBox="0 0 24 24" fill="currentColor"><path d="M12 4l-8 8h5v8h6v-8h5z"/></svg>
<span>+6.8%</span>
</div>
</div>
<div class="space-y-1.5 min-w-[140px]">
<div class="flex justify-between items-center bg-red-50 rounded-lg px-3 py-1.5">
<span class="text-sm text-red-600">酒水卡</span>
<span class="text-sm font-bold text-gray-13">¥118,500</span>
</div>
<div class="flex justify-between items-center bg-green-50 rounded-lg px-3 py-1.5">
<span class="text-sm text-green-600">台费卡</span>
<span class="text-sm font-bold text-gray-13">¥109,200</span>
</div>
<div class="flex justify-between items-center bg-blue-50 rounded-lg px-3 py-1.5">
<span class="text-sm text-blue-600">抵用券</span>
<span class="text-sm font-bold text-gray-13">¥16,200</span>
</div>
</div>
</div>
</div>
</div>
<!-- 发生额 → 入账收入 及 优惠影响 -->
<div class="bg-white rounded-2xl p-4 shadow-sm">
<div class="flex items-center gap-2 mb-4">
<span class="w-2 h-2 rounded-full bg-success"></span>
<h2 class="text-base font-semibold text-gray-13">发生额 → 入账收入 及 优惠影响</h2>
</div>
<!-- 收入确认(损益链)- UI设计 -->
<div class="mb-5">
<p class="card-section-title">收入确认(损益链)</p>
<!-- 发生额到成交收入的流程 -->
<div class="border-2 border-blue-200 rounded-2xl overflow-hidden">
<!-- 发生额 -->
<div class="bg-gradient-to-r from-blue-50 to-indigo-50 px-4 py-4">
<div class="flex justify-between items-center">
<span class="text-sm text-gray-10 font-semibold">发生额(正价)</span>
<div class="text-right">
<span class="text-xl font-bold text-gray-13">¥823,456</span>
<div class="compare-data compare-up justify-end" data-compare>
<svg class="w-3 h-3" viewBox="0 0 24 24" fill="currentColor"><path d="M12 4l-8 8h5v8h6v-8h5z"/></svg>
<span>+12.5%</span>
</div>
</div>
</div>
</div>
<!-- 优惠项目 - 缩进表示从属关系 -->
<div class="bg-white px-4 py-3 border-l-4 border-orange-300 ml-4 mr-4 my-3 rounded-r-lg">
<div class="space-y-3">
<div class="flex justify-between items-center">
<div>
<span class="text-sm text-gray-9">团购优惠</span>
</div>
<div class="flex items-center gap-2">
<span class="text-sm font-semibold text-error">-¥56,200</span>
<div class="compare-data compare-down text-[12px]" data-compare>
<svg class="w-2.5 h-2.5" viewBox="0 0 24 24" fill="currentColor"><path d="M12 20l8-8h-5V4H9v8H4z"/></svg>
<span>-5.2%</span>
</div>
</div>
</div>
<div class="flex justify-between items-center">
<div>
<span class="text-sm text-gray-9">手动调整 + 大客户优惠</span>
</div>
<div class="flex items-center gap-2">
<span class="text-sm font-semibold text-error">-¥34,800</span>
<div class="compare-data compare-up text-[12px]" data-compare>
<svg class="w-2.5 h-2.5" viewBox="0 0 24 24" fill="currentColor"><path d="M12 4l-8 8h5v8h6v-8h5z"/></svg>
<span>+3.1%</span>
</div>
</div>
</div>
<div class="flex justify-between items-start">
<div>
<span class="text-sm text-gray-9">赠送卡抵扣</span>
<p class="text-xs text-gray-5 mt-0.5">台桌卡+酒水卡+抵用券</p>
</div>
<div class="flex items-center gap-2">
<span class="text-sm font-semibold text-error">-¥22,336</span>
<div class="compare-data compare-up text-[12px]" data-compare>
<svg class="w-2.5 h-2.5" viewBox="0 0 24 24" fill="currentColor"><path d="M12 4l-8 8h5v8h6v-8h5z"/></svg>
<span>+8.6%</span>
</div>
</div>
</div>
<div class="flex justify-between items-start">
<div>
<span class="text-sm text-gray-9">其他优惠</span>
<p class="text-xs text-gray-5 mt-0.5">免单+抹零</p>
</div>
<span class="text-sm font-semibold text-gray-5">-¥0</span>
</div>
</div>
</div>
<!-- 成交/确认收入 -->
<div class="bg-gradient-to-r from-green-50 to-emerald-50 px-4 py-4 border-t-2 border-green-200">
<div class="flex justify-between items-center">
<span class="text-sm text-gray-10 font-semibold">成交/确认收入</span>
<div class="text-right">
<span class="text-xl font-bold text-success">¥710,120</span>
<div class="compare-data compare-up justify-end" data-compare>
<svg class="w-3 h-3" viewBox="0 0 24 24" fill="currentColor"><path d="M12 4l-8 8h5v8h6v-8h5z"/></svg>
<span>+8.7%</span>
</div>
</div>
</div>
</div>
<!-- 支付方式构成 - 整合到结构内 -->
<div class="bg-green-50/50 px-4 py-3 border-l-4 border-green-300 ml-4 mr-4 mb-4 rounded-r-lg">
<p class="text-xs text-gray-7 mb-2">由以下支付方式构成</p>
<div class="space-y-3">
<div class="flex justify-between items-center">
<span class="text-sm text-gray-9">储值卡结算冲销</span>
<div class="flex items-center gap-2">
<span class="text-sm font-semibold text-gray-11">¥238,200</span>
<div class="compare-data compare-up text-[12px]" data-compare>
<svg class="w-2.5 h-2.5" viewBox="0 0 24 24" fill="currentColor"><path d="M12 4l-8 8h5v8h6v-8h5z"/></svg>
<span>+11.2%</span>
</div>
</div>
</div>
<div class="flex justify-between items-center">
<span class="text-sm text-gray-9">现金/线上支付</span>
<div class="flex items-center gap-2">
<span class="text-sm font-semibold text-gray-11">¥345,800</span>
<div class="compare-data compare-up text-[12px]" data-compare>
<svg class="w-2.5 h-2.5" viewBox="0 0 24 24" fill="currentColor"><path d="M12 4l-8 8h5v8h6v-8h5z"/></svg>
<span>+7.8%</span>
</div>
</div>
</div>
<div class="flex justify-between items-start">
<div>
<span class="text-sm text-gray-9">团购核销确认收入</span>
<p class="text-xs text-gray-5 mt-0.5">团购成交价</p>
</div>
<div class="flex items-center gap-2">
<span class="text-sm font-semibold text-gray-11">¥126,120</span>
<div class="compare-data compare-up text-[12px]" data-compare>
<svg class="w-2.5 h-2.5" viewBox="0 0 24 24" fill="currentColor"><path d="M12 4l-8 8h5v8h6v-8h5z"/></svg>
<span>+5.3%</span>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- 收入结构 -->
<div>
<p class="card-section-title">收入结构</p>
<div class="bg-gray-50 rounded-xl overflow-hidden">
<!-- 表头 -->
<div class="grid grid-cols-4 gap-1 px-4 py-2.5 bg-gray-100 text-sm text-gray-8">
<span>项目</span>
<span class="text-right">发生额</span>
<span class="text-right">优惠</span>
<span class="text-right">入账</span>
</div>
<!-- 表体 -->
<div class="divide-y divide-gray-100">
<div class="grid grid-cols-4 gap-1 px-4 py-3">
<span class="text-sm text-gray-11 font-semibold">开台与包厢</span>
<span class="text-right text-base text-gray-10">¥358,600</span>
<span class="text-right text-base text-error">-¥45,200</span>
<div class="text-right">
<span class="text-base text-gray-11 font-semibold">¥313,400</span>
<div class="compare-data compare-up text-[12px] justify-end" data-compare>
<svg class="w-2.5 h-2.5" viewBox="0 0 24 24" fill="currentColor"><path d="M12 4l-8 8h5v8h6v-8h5z"/></svg>
<span>+9.2%</span>
</div>
</div>
</div>
<div class="grid grid-cols-4 gap-1 px-4 py-2 text-sm bg-white/50">
<span class="text-gray-7 pl-4">A区</span>
<span class="text-right text-gray-7">¥118,200</span>
<span class="text-right text-gray-7">-¥11,600</span>
<div class="text-right">
<span class="text-gray-7">¥106,600</span>
<div class="compare-data compare-up text-[12px] justify-end" data-compare>
<svg class="w-2 h-2" viewBox="0 0 24 24" fill="currentColor"><path d="M12 4l-8 8h5v8h6v-8h5z"/></svg>
<span>+12.1%</span>
</div>
</div>
</div>
<div class="grid grid-cols-4 gap-1 px-4 py-2 text-sm bg-white/50">
<span class="text-gray-7 pl-4">B区</span>
<span class="text-right text-gray-7">¥95,800</span>
<span class="text-right text-gray-7">-¥11,200</span>
<div class="text-right">
<span class="text-gray-7">¥84,600</span>
<div class="compare-data compare-up text-[12px] justify-end" data-compare>
<svg class="w-2 h-2" viewBox="0 0 24 24" fill="currentColor"><path d="M12 4l-8 8h5v8h6v-8h5z"/></svg>
<span>+8.5%</span>
</div>
</div>
</div>
<div class="grid grid-cols-4 gap-1 px-4 py-2 text-sm bg-white/50">
<span class="text-gray-7 pl-4">C区</span>
<span class="text-right text-gray-7">¥72,600</span>
<span class="text-right text-gray-7">-¥11,100</span>
<div class="text-right">
<span class="text-gray-7">¥61,500</span>
<div class="compare-data compare-up text-[12px] justify-end" data-compare>
<svg class="w-2 h-2" viewBox="0 0 24 24" fill="currentColor"><path d="M12 4l-8 8h5v8h6v-8h5z"/></svg>
<span>+6.3%</span>
</div>
</div>
</div>
<div class="grid grid-cols-4 gap-1 px-4 py-2 text-sm bg-white/50">
<span class="text-gray-7 pl-4">团建区</span>
<span class="text-right text-gray-7">¥48,200</span>
<span class="text-right text-gray-7">-¥6,800</span>
<div class="text-right">
<span class="text-gray-7">¥41,400</span>
<div class="compare-data compare-up text-[12px] justify-end" data-compare>
<svg class="w-2 h-2" viewBox="0 0 24 24" fill="currentColor"><path d="M12 4l-8 8h5v8h6v-8h5z"/></svg>
<span>+5.8%</span>
</div>
</div>
</div>
<div class="grid grid-cols-4 gap-1 px-4 py-2 text-sm bg-white/50">
<span class="text-gray-7 pl-4">麻将区</span>
<span class="text-right text-gray-7">¥23,800</span>
<span class="text-right text-gray-7">-¥4,500</span>
<div class="text-right">
<span class="text-gray-7">¥19,300</span>
<div class="compare-data compare-down text-[12px] justify-end" data-compare>
<svg class="w-2 h-2" viewBox="0 0 24 24" fill="currentColor"><path d="M12 20l8-8h-5V4H9v8H4z"/></svg>
<span>-2.1%</span>
</div>
</div>
</div>
<div class="grid grid-cols-4 gap-1 px-4 py-3">
<div>
<span class="text-sm text-gray-11 font-semibold">助教</span>
<p class="text-xs text-gray-6">基础课</p>
</div>
<span class="text-right text-base text-gray-10">¥232,500</span>
<span class="text-right text-base text-gray-5">-</span>
<div class="text-right">
<span class="text-base text-gray-11 font-semibold">¥232,500</span>
<div class="compare-data compare-up text-[12px] justify-end" data-compare>
<svg class="w-2.5 h-2.5" viewBox="0 0 24 24" fill="currentColor"><path d="M12 4l-8 8h5v8h6v-8h5z"/></svg>
<span>+15.3%</span>
</div>
</div>
</div>
<div class="grid grid-cols-4 gap-1 px-4 py-3">
<div>
<span class="text-sm text-gray-11 font-semibold">助教</span>
<p class="text-xs text-gray-6">激励课</p>
</div>
<span class="text-right text-base text-gray-10">¥112,800</span>
<span class="text-right text-base text-gray-5">-</span>
<div class="text-right">
<span class="text-base text-gray-11 font-semibold">¥112,800</span>
<div class="compare-data compare-up text-[12px] justify-end" data-compare>
<svg class="w-2.5 h-2.5" viewBox="0 0 24 24" fill="currentColor"><path d="M12 4l-8 8h5v8h6v-8h5z"/></svg>
<span>+8.2%</span>
</div>
</div>
</div>
<div class="grid grid-cols-4 gap-1 px-4 py-3">
<span class="text-sm text-gray-11 font-semibold">食品酒水</span>
<span class="text-right text-base text-gray-10">¥119,556</span>
<span class="text-right text-base text-error">-¥68,136</span>
<div class="text-right">
<span class="text-base text-gray-11 font-semibold">¥51,420</span>
<div class="compare-data compare-up text-[12px] justify-end" data-compare>
<svg class="w-2.5 h-2.5" viewBox="0 0 24 24" fill="currentColor"><path d="M12 4l-8 8h5v8h6v-8h5z"/></svg>
<span>+6.5%</span>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- 现金流 - 独立卡片 -->
<div class="bg-white rounded-2xl p-4 shadow-sm">
<div class="flex items-center gap-2 mb-4">
<span class="w-2 h-2 rounded-full bg-primary"></span>
<h2 class="text-base font-semibold text-gray-13">现金流</h2>
</div>
<div class="space-y-3">
<div class="flex justify-between items-center bg-gray-50 rounded-xl px-4 py-3">
<div>
<p class="text-sm text-gray-10 font-semibold">消费现金流入</p>
<p class="text-xs text-gray-6 mt-0.5">现金+线上+平台回款−退款</p>
</div>
<div class="text-right">
<span class="text-lg font-bold text-gray-13">¥471,920</span>
<div class="compare-data compare-up justify-end" data-compare>
<svg class="w-3 h-3" viewBox="0 0 24 24" fill="currentColor"><path d="M12 4l-8 8h5v8h6v-8h5z"/></svg>
<span>+6.8%</span>
</div>
</div>
</div>
<div class="flex justify-between items-center bg-gray-50 rounded-xl px-4 py-3">
<div>
<p class="text-sm text-gray-10 font-semibold">充值到账</p>
<p class="text-xs text-gray-6 mt-0.5">首充/续费</p>
</div>
<div class="text-right">
<span class="text-lg font-bold text-gray-13">¥352,800</span>
<div class="compare-data compare-up justify-end" data-compare>
<svg class="w-3 h-3" viewBox="0 0 24 24" fill="currentColor"><path d="M12 4l-8 8h5v8h6v-8h5z"/></svg>
<span>+18.5%</span>
</div>
</div>
</div>
<div class="flex justify-between items-center bg-primary/5 rounded-xl px-4 py-4">
<span class="text-base text-gray-10 font-semibold">现金流入合计</span>
<div class="text-right">
<span class="text-xl font-bold text-primary">¥824,720</span>
<div class="compare-data compare-up justify-end" data-compare>
<svg class="w-3 h-3" viewBox="0 0 24 24" fill="currentColor"><path d="M12 4l-8 8h5v8h6v-8h5z"/></svg>
<span>+10.2%</span>
</div>
</div>
</div>
</div>
</div>
<!-- 支出结构 - 简化设计 -->
<div class="bg-white rounded-2xl p-4 shadow-sm">
<div class="flex items-center gap-2 mb-4">
<span class="w-2 h-2 rounded-full bg-error"></span>
<h2 class="text-base font-semibold text-gray-13">支出结构</h2>
</div>
<!-- 助教相关 - 2*2排布 -->
<p class="text-sm font-semibold text-gray-11 mb-2 flex items-center"><span class="w-1.5 h-1.5 rounded-full bg-orange-400 mr-2"></span>助教相关</p>
<div class="grid grid-cols-2 gap-2 mb-6">
<div class="bg-orange-50 rounded-lg px-3 py-4 text-center">
<p class="text-sm text-gray-8 mb-1">基础分成</p>
<p class="text-lg font-bold text-gray-13">¥116,250</p>
<div class="compare-data compare-up text-[12px] justify-center" data-compare>
<svg class="w-3 h-3" viewBox="0 0 24 24" fill="currentColor"><path d="M12 4l-8 8h5v8h6v-8h5z"/></svg>
<span>+8.2%</span>
</div>
</div>
<div class="bg-orange-50 rounded-lg px-3 py-4 text-center">
<p class="text-sm text-gray-8 mb-1">附加分成</p>
<p class="text-lg font-bold text-gray-13">¥23,840</p>
<div class="compare-data compare-up text-[12px] justify-center" data-compare>
<svg class="w-3 h-3" viewBox="0 0 24 24" fill="currentColor"><path d="M12 4l-8 8h5v8h6v-8h5z"/></svg>
<span>+5.6%</span>
</div>
</div>
<div class="bg-orange-50 rounded-lg px-3 py-4 text-center">
<p class="text-sm text-gray-8 mb-1">充值提成</p>
<p class="text-lg font-bold text-gray-13">¥12,640</p>
<div class="compare-data compare-up text-[12px] justify-center" data-compare>
<svg class="w-3 h-3" viewBox="0 0 24 24" fill="currentColor"><path d="M12 4l-8 8h5v8h6v-8h5z"/></svg>
<span>+12.3%</span>
</div>
</div>
<div class="bg-orange-50 rounded-lg px-3 py-4 text-center">
<p class="text-sm text-gray-8 mb-1">额外奖金</p>
<p class="text-lg font-bold text-gray-13">¥11,500</p>
<div class="compare-data compare-down text-[12px] justify-center" data-compare>
<svg class="w-3 h-3" viewBox="0 0 24 24" fill="currentColor"><path d="M12 20l8-8h-5V4H9v8H4z"/></svg>
<span>-3.1%</span>
</div>
</div>
</div>
<!-- 进货与运营 -->
<p class="text-sm font-semibold text-gray-11 mb-2 flex items-center"><span class="w-1.5 h-1.5 rounded-full bg-cyan-400 mr-2"></span>进货与运营</p>
<div class="grid grid-cols-3 gap-2 mb-6">
<div class="bg-cyan-50 rounded-lg px-3 py-4 text-center">
<p class="text-sm text-gray-8 mb-1">食品饮料</p>
<p class="text-lg font-bold text-gray-13">¥108,200</p>
<div class="compare-data compare-up text-[12px] justify-center" data-compare>
<svg class="w-3 h-3" viewBox="0 0 24 24" fill="currentColor"><path d="M12 4l-8 8h5v8h6v-8h5z"/></svg>
<span>+4.5%</span>
</div>
</div>
<div class="bg-cyan-50 rounded-lg px-3 py-4 text-center">
<p class="text-sm text-gray-8 mb-1">耗材</p>
<p class="text-lg font-bold text-gray-13">¥21,850</p>
<div class="compare-data compare-down text-[12px] justify-center" data-compare>
<svg class="w-3 h-3" viewBox="0 0 24 24" fill="currentColor"><path d="M12 20l8-8h-5V4H9v8H4z"/></svg>
<span>-2.1%</span>
</div>
</div>
<div class="bg-cyan-50 rounded-lg px-3 py-4 text-center">
<p class="text-sm text-gray-8 mb-1">报销</p>
<p class="text-lg font-bold text-gray-13">¥10,920</p>
<div class="compare-data compare-up text-[12px] justify-center" data-compare>
<svg class="w-3 h-3" viewBox="0 0 24 24" fill="currentColor"><path d="M12 4l-8 8h5v8h6v-8h5z"/></svg>
<span>+6.8%</span>
</div>
</div>
</div>
<!-- 固定支出 - 2*2排布 -->
<p class="text-sm font-semibold text-gray-11 mb-2 flex items-center"><span class="w-1.5 h-1.5 rounded-full bg-purple-400 mr-2"></span>固定支出</p>
<div class="grid grid-cols-2 gap-2 mb-6">
<div class="bg-purple-50 rounded-lg px-3 py-4 text-center">
<p class="text-sm text-gray-8 mb-1">房租</p>
<p class="text-lg font-bold text-gray-13">¥125,000</p>
<div class="compare-data text-[12px] text-gray-5 justify-center" data-compare>
<span>持平</span>
</div>
</div>
<div class="bg-purple-50 rounded-lg px-3 py-4 text-center">
<p class="text-sm text-gray-8 mb-1">水电</p>
<p class="text-lg font-bold text-gray-13">¥24,200</p>
<div class="compare-data compare-up text-[12px] justify-center" data-compare>
<svg class="w-3 h-3" viewBox="0 0 24 24" fill="currentColor"><path d="M12 4l-8 8h5v8h6v-8h5z"/></svg>
<span>+3.2%</span>
</div>
</div>
<div class="bg-purple-50 rounded-lg px-3 py-4 text-center">
<p class="text-sm text-gray-8 mb-1">物业</p>
<p class="text-lg font-bold text-gray-13">¥11,500</p>
<div class="compare-data text-[12px] text-gray-5 justify-center" data-compare>
<span>持平</span>
</div>
</div>
<div class="bg-purple-50 rounded-lg px-3 py-4 text-center">
<p class="text-sm text-gray-8 mb-1">人员工资</p>
<p class="text-lg font-bold text-gray-13">¥112,000</p>
<div class="compare-data text-[12px] text-gray-5 justify-center" data-compare>
<span>持平</span>
</div>
</div>
</div>
<!-- 平台服务费 -->
<p class="text-sm font-semibold text-gray-11 mb-2 flex items-center"><span class="w-1.5 h-1.5 rounded-full bg-indigo-400 mr-2"></span>平台服务费</p>
<div class="grid grid-cols-3 gap-2 mb-6">
<div class="bg-indigo-50 rounded-lg px-3 py-4 text-center">
<p class="text-sm text-gray-8 mb-1">汇来米</p>
<p class="text-lg font-bold text-gray-13">¥10,680</p>
<div class="compare-data compare-up text-[12px] justify-center" data-compare>
<svg class="w-3 h-3" viewBox="0 0 24 24" fill="currentColor"><path d="M12 4l-8 8h5v8h6v-8h5z"/></svg>
<span>+1.5%</span>
</div>
</div>
<div class="bg-indigo-50 rounded-lg px-3 py-4 text-center">
<p class="text-sm text-gray-8 mb-1">美团</p>
<p class="text-lg font-bold text-gray-13">¥11,240</p>
<div class="compare-data compare-up text-[12px] justify-center" data-compare>
<svg class="w-3 h-3" viewBox="0 0 24 24" fill="currentColor"><path d="M12 4l-8 8h5v8h6v-8h5z"/></svg>
<span>+2.8%</span>
</div>
</div>
<div class="bg-indigo-50 rounded-lg px-3 py-4 text-center">
<p class="text-sm text-gray-8 mb-1">抖音</p>
<p class="text-lg font-bold text-gray-13">¥10,580</p>
<div class="compare-data compare-up text-[12px] justify-center" data-compare>
<svg class="w-3 h-3" viewBox="0 0 24 24" fill="currentColor"><path d="M12 4l-8 8h5v8h6v-8h5z"/></svg>
<span>+3.5%</span>
</div>
</div>
</div>
<!-- 支出合计 -->
<div class="bg-error/10 rounded-xl px-4 py-4 flex justify-between items-center border border-error/20">
<span class="text-base font-semibold text-gray-10">支出合计</span>
<div class="text-right">
<span class="text-xl font-bold text-error">¥600,400</span>
<div class="compare-data compare-up justify-end" data-compare>
<svg class="w-3 h-3" viewBox="0 0 24 24" fill="currentColor"><path d="M12 4l-8 8h5v8h6v-8h5z"/></svg>
<span>+2.1%</span>
</div>
</div>
</div>
</div>
<!-- 助教收支分析 -->
<div class="bg-white rounded-2xl p-4 shadow-sm">
<div class="flex items-center gap-2 mb-4">
<span class="w-2 h-2 rounded-full bg-warning"></span>
<h2 class="text-base font-semibold text-gray-13">助教收支分析</h2>
</div>
<!-- 基础课 -->
<div class="mb-4">
<p class="card-section-title">助教 <span class="text-xs text-gray-7 font-normal">(基础课)</span></p>
<div class="bg-gray-50 rounded-xl overflow-hidden">
<!-- 表头 -->
<div class="grid grid-cols-4 gap-1 px-4 py-2.5 bg-gray-100 text-sm text-gray-8">
<span>级别</span>
<span class="text-right">客户支付</span>
<span class="text-right">球房抽成</span>
<span class="text-right">小时平均</span>
</div>
<!-- 合计 -->
<div class="grid grid-cols-4 gap-1 px-4 py-3 bg-primary/5">
<span class="text-sm text-gray-11 font-semibold">合计</span>
<div class="text-right">
<span class="text-base text-gray-11 font-semibold">¥232,500</span>
<div class="compare-data compare-up text-[12px] justify-end" data-compare>
<svg class="w-2 h-2" viewBox="0 0 24 24" fill="currentColor"><path d="M12 4l-8 8h5v8h6v-8h5z"/></svg>
<span>+15.3%</span>
</div>
</div>
<div class="text-right">
<span class="text-base text-success font-semibold">¥116,250</span>
<div class="compare-data compare-up text-[12px] justify-end" data-compare>
<svg class="w-2 h-2" viewBox="0 0 24 24" fill="currentColor"><path d="M12 4l-8 8h5v8h6v-8h5z"/></svg>
<span>+15.3%</span>
</div>
</div>
<div class="text-right">
<span class="text-base text-gray-9">¥25/h</span>
<div class="compare-data compare-up text-[12px] justify-end" data-compare>
<svg class="w-2 h-2" viewBox="0 0 24 24" fill="currentColor"><path d="M12 4l-8 8h5v8h6v-8h5z"/></svg>
<span>+4.2%</span>
</div>
</div>
</div>
<!-- 明细 -->
<div class="divide-y divide-gray-100">
<div class="grid grid-cols-4 gap-1 px-4 py-2.5">
<span class="text-sm text-gray-9">初级</span>
<div class="text-right">
<span class="text-base text-gray-9">¥68,600</span>
<div class="compare-data compare-up text-[12px] justify-end" data-compare>
<svg class="w-2 h-2" viewBox="0 0 24 24" fill="currentColor"><path d="M12 4l-8 8h5v8h6v-8h5z"/></svg>
<span>+12.5%</span>
</div>
</div>
<div class="text-right">
<span class="text-base text-gray-9">¥34,300</span>
<div class="compare-data compare-up text-[12px] justify-end" data-compare>
<svg class="w-2 h-2" viewBox="0 0 24 24" fill="currentColor"><path d="M12 4l-8 8h5v8h6v-8h5z"/></svg>
<span>+12.5%</span>
</div>
</div>
<div class="text-right">
<span class="text-sm text-gray-7">¥20/h</span>
<div class="compare-data text-[12px] text-gray-5 justify-end" data-compare>
<span>持平</span>
</div>
</div>
</div>
<div class="grid grid-cols-4 gap-1 px-4 py-2.5">
<span class="text-sm text-gray-9">中级</span>
<div class="text-right">
<span class="text-base text-gray-9">¥82,400</span>
<div class="compare-data compare-up text-[12px] justify-end" data-compare>
<svg class="w-2 h-2" viewBox="0 0 24 24" fill="currentColor"><path d="M12 4l-8 8h5v8h6v-8h5z"/></svg>
<span>+18.2%</span>
</div>
</div>
<div class="text-right">
<span class="text-base text-gray-9">¥41,200</span>
<div class="compare-data compare-up text-[12px] justify-end" data-compare>
<svg class="w-2 h-2" viewBox="0 0 24 24" fill="currentColor"><path d="M12 4l-8 8h5v8h6v-8h5z"/></svg>
<span>+18.2%</span>
</div>
</div>
<div class="text-right">
<span class="text-sm text-gray-7">¥25/h</span>
<div class="compare-data compare-up text-[12px] justify-end" data-compare>
<svg class="w-2 h-2" viewBox="0 0 24 24" fill="currentColor"><path d="M12 4l-8 8h5v8h6v-8h5z"/></svg>
<span>+8.7%</span>
</div>
</div>
</div>
<div class="grid grid-cols-4 gap-1 px-4 py-2.5">
<span class="text-sm text-gray-9">高级</span>
<div class="text-right">
<span class="text-base text-gray-9">¥57,800</span>
<div class="compare-data compare-up text-[12px] justify-end" data-compare>
<svg class="w-2 h-2" viewBox="0 0 24 24" fill="currentColor"><path d="M12 4l-8 8h5v8h6v-8h5z"/></svg>
<span>+14.6%</span>
</div>
</div>
<div class="text-right">
<span class="text-base text-gray-9">¥28,900</span>
<div class="compare-data compare-up text-[12px] justify-end" data-compare>
<svg class="w-2 h-2" viewBox="0 0 24 24" fill="currentColor"><path d="M12 4l-8 8h5v8h6v-8h5z"/></svg>
<span>+14.6%</span>
</div>
</div>
<div class="text-right">
<span class="text-sm text-gray-7">¥30/h</span>
<div class="compare-data text-[12px] text-gray-5 justify-end" data-compare>
<span>持平</span>
</div>
</div>
</div>
<div class="grid grid-cols-4 gap-1 px-4 py-2.5">
<span class="text-sm text-gray-9">星级</span>
<div class="text-right">
<span class="text-base text-gray-9">¥23,700</span>
<div class="compare-data compare-down text-[12px] justify-end" data-compare>
<svg class="w-2 h-2" viewBox="0 0 24 24" fill="currentColor"><path d="M12 20l8-8h-5V4H9v8H4z"/></svg>
<span>-3.2%</span>
</div>
</div>
<div class="text-right">
<span class="text-base text-gray-9">¥11,850</span>
<div class="compare-data compare-down text-[12px] justify-end" data-compare>
<svg class="w-2 h-2" viewBox="0 0 24 24" fill="currentColor"><path d="M12 20l8-8h-5V4H9v8H4z"/></svg>
<span>-3.2%</span>
</div>
</div>
<div class="text-right">
<span class="text-sm text-gray-7">¥35/h</span>
<div class="compare-data text-[12px] text-gray-5 justify-end" data-compare>
<span>持平</span>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- 激励课 -->
<div>
<p class="card-section-title">助教 <span class="text-xs text-gray-7 font-normal">(激励课)</span></p>
<div class="bg-amber-50 rounded-xl overflow-hidden">
<!-- 表头 -->
<div class="grid grid-cols-4 gap-1 px-4 py-2.5 bg-amber-100/50 text-sm text-gray-8">
<span>级别</span>
<span class="text-right">客户支付</span>
<span class="text-right">球房抽成</span>
<span class="text-right">小时平均</span>
</div>
<!-- 合计 -->
<div class="grid grid-cols-4 gap-1 px-4 py-3">
<span class="text-sm text-gray-11 font-semibold">合计</span>
<div class="text-right">
<span class="text-base text-gray-11 font-semibold">¥112,800</span>
<div class="compare-data compare-up text-[12px] justify-end" data-compare>
<svg class="w-2 h-2" viewBox="0 0 24 24" fill="currentColor"><path d="M12 4l-8 8h5v8h6v-8h5z"/></svg>
<span>+8.2%</span>
</div>
</div>
<div class="text-right">
<span class="text-base text-success font-semibold">¥33,840</span>
<div class="compare-data compare-up text-[12px] justify-end" data-compare>
<svg class="w-2 h-2" viewBox="0 0 24 24" fill="currentColor"><path d="M12 4l-8 8h5v8h6v-8h5z"/></svg>
<span>+8.2%</span>
</div>
</div>
<div class="text-right">
<span class="text-base text-gray-9">¥15/h</span>
<div class="compare-data compare-up text-[12px] justify-end" data-compare>
<svg class="w-2 h-2" viewBox="0 0 24 24" fill="currentColor"><path d="M12 4l-8 8h5v8h6v-8h5z"/></svg>
<span>+2.1%</span>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- 提示弹窗遮罩 -->
<div id="tipOverlay" class="tip-overlay" onclick="closeTip()" ontouchstart="closeTip()" ontouchmove="closeTip()"></div>
<!-- 提示弹窗 -->
<div id="tipToast" class="tip-toast">
<div class="flex justify-between items-start mb-2">
<span class="text-sm text-primary font-medium" id="tipTitle">说明</span>
<button onclick="closeTip()" class="text-gray-5 hover:text-gray-7">
<svg class="w-5 h-5" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
<line x1="18" y1="6" x2="6" y2="18"></line>
<line x1="6" y1="6" x2="18" y2="18"></line>
</svg>
</button>
</div>
<div class="tip-toast-content" id="tipContent"></div>
</div>
<!-- 悬浮助手按钮 -->
<script src="../js/ai-float-btn.js"></script>
<!-- 通用底部导航 -->
<script src="../js/bottom-nav.js"></script>
<script>
let currentFilter = null;
let compareEnabled = false;
// 提示内容配置
const tipContents = {
occurrence: {
title: '发生额/正价',
content: `按台桌/包厢/助教/酒水的"正价"计算出的理论销售额,反映经营规模与业务量。
计算方式 = 各收入项目按正价 × 数量/时长汇总计算。
<strong>不是最终收到了多少钱。</strong>`
},
discount: {
title: '总优惠',
content: `本期因团购差价、大客户折扣、赠送卡抵扣、免单/抹零等导致的让利总额,用于解释"发生额"与"成交/确认收入"的差异。
计算方式 = 发生额 成交/确认收入
或 = 团购优惠 + 大客户优惠 + 赠送抵扣 + 其他优惠/免单/抹零(汇总)`
},
confirmed: {
title: '成交/确认收入',
content: `扣除各种优惠后的成交金额,<strong>按记账规则统计的营业收入</strong>。
计算方式 = 发生额 团购优惠 大客户优惠 赠送抵扣(及其他优惠)。
<strong>不含充值营业收入</strong> 充值是预收/负债,但会影响现金流。`
},
cashIn: {
title: '实收/现金流入',
content: `统计真实进账的资金,包括现金 + 线上支付 + 平台回款。
计算方式 = 消费实收 + 平台团购 - 各类退款/冲正。
<strong>此为现金口径,不等于营业收入。</strong>区别为:充值属于预收款的现金流入,属于预存行为,球房债务。`
},
cashOut: {
title: '现金支出',
content: `本期所有支出项目的合计。
计算方式 = 房租 + 水电 + 进货成本支出 + 耗材 + 报销 + 助教分成 + 固定人员工资 + 平台服务费 + 其他费用`
},
balance: {
title: '现金结余',
content: `本期营业收入扣除全部成本后的利润,用于衡量经营质量。
计算方式= 实收/现金流入 总支出。`
},
rechargeActual: {
title: '储值卡充值实收',
content: `本期储值卡充值到账的新增金额。
按照首充,续费,合计路径进行统计。
计算方式 = 本期储值卡充值订单的实收金额。
不含赠送金额`
},
allCardBalance: {
title: '全类别会员卡余额合计',
content: `截至本期末,顾客充值后尚未消费的储值余额,包括赠送的台费卡酒水卡等类别,用于判断未来可转化的消费规模。
计算方式 = 各类会员卡往期余额 + 本期充值到账与赠送到账 本期卡消耗 ± 调整(退款/冲正/手工修正)`
},
recharge: {
title: '储值卡充值',
content: `本期储值卡充值到账的新增金额。`
},
consume: {
title: '储值卡消耗',
content: `余额卡在查询周期内消耗金额。
计算方式 = 本期消耗 ± 调整`
},
cardBalance: {
title: '储值卡总余额',
content: `截至本期末,余额卡可用的余额。
计算方式 = 期初余额卡余额 + 本期新增 本期消耗 ± 调整`
},
giftNew: {
title: '赠送卡新增合计',
content: `本期各类型赠送卡的新增金额。`
},
giftConsume: {
title: '赠送卡消费合计',
content: `本期各类型赠送卡在查询周期内消耗金额。
计算方式 = 本期消耗 ± 调整`
},
giftBalance: {
title: '赠送卡总余额合计',
content: `截至本期末,各类型赠送卡可用的余额。
计算方式 = 期初余额 + 本期新增 本期消耗 ± 调整`
}
};
function positionDropdown(dropdownEl) {
const bar = document.getElementById('filterBar');
if (!bar || !dropdownEl) return;
const rect = bar.getBoundingClientRect();
dropdownEl.style.top = `${rect.bottom}px`;
}
function toggleFilter(type) {
const overlay = document.getElementById('filterOverlay');
const timeDropdown = document.getElementById('timeDropdown');
const areaDropdown = document.getElementById('areaDropdown');
if (currentFilter === type) {
closeAllFilters();
return;
}
closeAllFilters();
currentFilter = type;
overlay.classList.add('show');
if (type === 'time') {
positionDropdown(timeDropdown);
timeDropdown.classList.add('show');
} else if (type === 'area') {
positionDropdown(areaDropdown);
areaDropdown.classList.add('show');
}
}
function closeAllFilters() {
currentFilter = null;
document.getElementById('filterOverlay').classList.remove('show');
document.getElementById('timeDropdown').classList.remove('show');
document.getElementById('areaDropdown').classList.remove('show');
}
function selectTime(value) {
document.getElementById('timeLabel').textContent = value;
closeAllFilters();
}
function selectArea(value) {
document.getElementById('areaLabel').textContent = value;
closeAllFilters();
}
// 对比开关
function toggleCompare() {
compareEnabled = !compareEnabled;
const toggle = document.getElementById('compareToggle');
const compareDatas = document.querySelectorAll('[data-compare]');
if (compareEnabled) {
toggle.classList.add('active');
compareDatas.forEach(el => el.classList.add('show'));
} else {
toggle.classList.remove('active');
compareDatas.forEach(el => el.classList.remove('show'));
}
}
// 提示弹窗
function showTip(type) {
const toast = document.getElementById('tipToast');
const overlay = document.getElementById('tipOverlay');
const titleEl = document.getElementById('tipTitle');
const contentEl = document.getElementById('tipContent');
const tip = tipContents[type];
if (!tip) return;
titleEl.textContent = tip.title;
contentEl.innerHTML = tip.content;
overlay.classList.add('show');
toast.classList.add('show');
}
function closeTip() {
const toast = document.getElementById('tipToast');
const overlay = document.getElementById('tipOverlay');
toast.classList.remove('show');
overlay.classList.remove('show');
}
// 滚动时:下滑隐藏筛选栏,上滑显示
(function initFilterBarScrollBehavior() {
const bar = document.getElementById('filterBar');
if (!bar) return;
const TRIGGER_DISTANCE_DOWN = 24;
const TRIGGER_DISTANCE_UP = 12;
const JITTER_THRESHOLD = 2;
let lastY = window.scrollY || 0;
let lastDir = null;
let ticking = false;
let acc = 0;
let lockedDir = null;
bar.classList.add('filter-bar-enter');
window.requestAnimationFrame(() => {
bar.classList.remove('filter-bar-enter');
});
function setVisible(visible) {
if (visible) {
bar.classList.remove('filter-bar-hidden');
} else {
if (!bar.classList.contains('filter-bar-hidden')) closeAllFilters();
bar.classList.add('filter-bar-hidden');
}
}
function resetGesture(y) {
lastY = y;
lastDir = null;
acc = 0;
lockedDir = null;
}
function onScrollFrame() {
const y = window.scrollY || 0;
if (y <= 8) {
setVisible(true);
resetGesture(y);
return;
}
const delta = y - lastY;
if (Math.abs(delta) <= JITTER_THRESHOLD) {
lastY = y;
return;
}
const dir = delta > 0 ? 'down' : 'up';
if (delta !== 0) {
if (lastDir === null) {
lastDir = dir;
acc = 0;
lockedDir = null;
} else if (dir !== lastDir) {
lastDir = dir;
acc = 0;
lockedDir = null;
}
}
lastY = y;
if (lockedDir === dir) return;
acc += Math.abs(delta);
const threshold = dir === 'up' ? TRIGGER_DISTANCE_UP : TRIGGER_DISTANCE_DOWN;
if (acc < threshold) return;
setVisible(dir === 'up');
lockedDir = dir;
acc = 0;
}
window.addEventListener('scroll', () => {
if (ticking) return;
ticking = true;
window.requestAnimationFrame(() => {
onScrollFrame();
ticking = false;
});
}, { passive: true });
})();
</script>
</body>
</html>