Finance Dashboard — 开发者文档
> 最后更新:2026-06-08
> 作者:Hermes Agent
> HTTP:https://sieta.vip/sietadata/finance-dashboard.html
概述
SIETA 经营财报 Dashboard 是一个纯静态 HTML 页面,数据嵌入在页面中,通过 Chart.js 渲染交互式图表。页面支持店铺筛选、环比/同比对比、期间范围选择。
- 访问地址:https://sieta.vip/portal/finance/
- 认证方式:nginx 层 cookie 认证(finance_auth=Sieta@2006 或 portal 的 admin_token cookie)
- 部署路径:/var/www/sieta/finance/index.html
- 设计风格:Flat Design(无阴影、色块分明、Outfit 字体)
数据源
finance_source.xlsx
路径:~/sietadata/dashboard/finance_source.xlsx
包含 5 个 Sheet:
| Sheet |
用途 |
当前使用 |
| 月度数据 |
按月+店铺的损益数据 |
✅ 唯一数据源 |
| 季度数据 |
按季汇总 |
❌ 未使用 |
| 半年数据 |
半年汇总 |
❌ 未使用 |
| 年度数据 |
年度汇总 |
❌ 未使用 |
| 资产负债表 |
资产负债数据 |
❌ 未使用 |
月度数据结构(24 列)
| 列名 |
说明 |
用途 |
| 年月 |
格式 YYYYMM(如 202301) |
时间维度 |
| 店铺 |
店铺编码(101-108,不含 107) |
店铺维度 |
| 销售 |
销售额 |
KPI + 图表 |
| 成本 |
销售成本 |
计算毛利 |
| 毛利 |
销售额 - 成本 |
KPI + 图表 |
| 房租 |
门店租金 |
经营费用 |
| 工资 |
员工工资 |
经营费用 |
| 奖金 |
员工奖金 |
经营费用 |
| 运费 |
物流运费 |
经营费用 |
| 水电 |
水电费 |
经营费用 |
| 电信 |
通信费 |
经营费用 |
| 商场扣点 |
商场扣点费 |
商场费用 |
| 商场扣税 |
商场扣税费 |
商场费用 |
| 商场促销费 |
促销活动费 |
商场费用 |
| 商场费用 |
其他商场费 |
商场费用 |
| 商场其它 |
商场杂费 |
商场费用 |
| 装修分摊 |
装修费分摊 |
其它经营费用 |
| 办公费 |
办公用品 |
其它经营费用 |
| 手续费 |
银行手续费 |
其它经营费用 |
| 其它 |
杂项支出 |
其它经营费用 |
| 场地租金 |
办公室/仓库租金 |
后台费用 |
| 主管工资 |
主管薪资 |
后台费用 |
| 内勤工资 |
内勤薪资 |
后台费用 |
| 净利润 |
毛利 - 全部费用 |
KPI + 图表 |
费用计算层级
``
基础经营费用 = 房租 + 工资 + 奖金 + 运费 + 水电 + 电信
商场费用汇总 = 商场扣点 + 商场扣税 + 商场促销费 + 商场费用 + 商场其它
其它经营费用 = 装修分摊 + 办公费 + 手续费 + 其它
经营费用 = 基础经营费用 + 商场费用汇总 + 其它经营费用
后台费用 = 场地租金 + 主管工资 + 内勤工资
总费用 = 经营费用 + 后台费用
`
店铺编码映射
| 编码 |
店名 |
说明 |
| 0 |
全部 |
JS 动态汇总 |
| 101 |
一店 |
— |
| 102 |
二店 |
— |
| 103 |
三店 |
已关闭/已合并 |
| 104 |
四店 |
— |
| 105 |
五店 |
— |
| 106 |
六店 |
— |
| 107 |
— |
不存在,跳过 |
| 108 |
八店 |
— |
> 页面只显示有销售数据的店铺(getActiveStores() 动态检测)。
生成流程
1. 更新数据
编辑 finance_source.xlsx 的「月度数据」sheet,新增行或修改已有数据。
> ⚠️ 必须用 int 类型存「年月」和「店铺」列,不能用字符串。缺失的列脚本自动填 0。
2. 运行生成脚本
`bash
cd ~/sietadata/dashboard && python3 build_dashboard_v2.py
`
依赖:pandas、numpy、openpyxl(系统 python3 已安装)。
脚本做了什么:
1. 读取「月度数据」sheet → pandas DataFrame
2. 填充缺失列为 0
3. 计算经营费用/毛利率/净利率/费用率
4. 汇总所有店铺数据生成「全部」(店铺=0)行
5. 将数据序列化为 JSON 嵌入 HTML 模板
6. 输出 index.html 到当前目录
3. 部署到 nginx
`bash
sudo cp ~/sietadata/dashboard/index.html /var/www/sieta/finance/
`
4. 验证
`bash
curl -sI -H 'Cookie: finance_auth=Sieta@2006' https://sieta.vip/portal/finance/
预期:HTTP/1.1 200 OK
`
页面功能
KPI 卡片(6 个)
- 销售额、毛利、净利润、毛利率、费用率、净利率
- 显示环比/同比变化百分比(红涨绿跌)
对比图表(6 个)
- 3 列网格布局,各店铺分组柱状图
- 蓝色=本期,橙色=环比,灰色=同比
- 对比数据不存在时显示「环比无数据」标记
经营趋势图(底部全宽)
- 折线图:销售额(蓝)、毛利(橙)、净利润(绿)
- 选中期间内逐月展示
数据明细表
- 按店铺+月份列出全部财务指标
- 最优值标红加粗
交互控制
- 店铺筛选:按钮组,默认「全部」,可多选
- 对比模式:环比 / 同比 / 环比+同比
- 期间范围:起止月份下拉框
认证架构
nginx 配置(/etc/nginx/sites-enabled/default):
`
location /portal/finance/ {
# 双 cookie 认证:finance_auth 或 admin_token
set $finok 0;
if ($cookie_finance_auth = "Sieta@2006") { set $finok 1; }
if ($cookie_admin_token) { set $finok 1; }
if ($finok = 0) {
return 401;
}
alias /var/www/sieta/finance/;
index index.html;
}
`
两种访问方式:
1. 直接访问 → 401 → 先访问 /portal/finance/auth?token=Sieta@2006 设置 cookie
2. 从 Portal 首页(/portal/)进入 → admin_token cookie 已存在 → 免检
维护注意事项
添加新店铺
1. 在 finance_source.xlsx 月度数据中新增该店铺的行
2. 在 store_names 字典中添加映射(build_dashboard_v2.py 第 82 行):
`python
store_names = {0:'全部', 101:'一店', ..., 108:'八店', 109:'新店'}
`
添加新费用科目
1. 在 xlsx 中添加新列
2. 在脚本的 for col in [...] 列表(第 23 行)中添加列名
3. 确认该列应归入哪个费用类别(基础经营/商场/其它/后台)
修改页面样式
- 所有 CSS 在 HTML 模板的