2026-06-25 12:08:45 +08:00
2026-06-25 12:08:45 +08:00

CapacityReport - 容量报表处理系统

CapacityReport 用于导入每周容量报表数据,按 Configure.json 的字段映射和 ReportScript.sql 的业务脚本完成数据清洗、入库、计算和结果表生成。系统支持本地上传处理,也支持从 FTP/SFTP 远程目录递归下载数据后自动处理。

双模式后端(自带 FTP/MySQL,或接入 Metrix 平台)

CapacityReport 是自包含应用,源与仓库各自可在「直连」与「Metrix 平台」之间独立选择,二者可任意组合,互不依赖——Metrix 在不在、CapacityReport 怎么跑都不影响:

  • 数据源(系统设置 → 数据源/仓库):SFTP / FTP(直连,填服务器与账号密码)或 Metrix 存储平台(填平台地址 + Token + storage_id)。
  • 数据仓库:MySQL(直连,填主机/账号密码)或 Metrix 数据库平台(填平台地址 + Token + database_conn_id + 目标库)。
  • Metrix 连接作为一种连接类型在「数据源/仓库」标签页配置:base_url + API Token(存配置,非环境变量)+ storage_id(存储平台)+ database_conn_id/target_database(数据库平台),存储/数据库平台共用同一地址与 Token。
  • 直连模式走原生路径(自带 LOAD DATA 入库、单会话跑报表 SQL、本地查看/导出);Metrix 模式下源走平台储存 API、仓库走平台导入 + run-script(single_session),「数据管理」查看/导出自动代理到 Metrix 的 table-data/导出接口。
  • 切换后端不改业务:字段映射、报表 SQL、自动调度、处理历史在两种模式下一致。

功能概览

  • Excel/CSV/ZIP 数据导入与自动解压、转换、入库。
  • FTP/SFTP 远程数据源配置、连接测试、远程下载并处理。
  • 远程自动调度:按远程 ZIP 文件名日期检查目标自然周 7 天数据,就绪后自动下载并处理。
  • MySQL 数据表查看、清空、删除、CSV/XLSX 导出。
  • SQL 脚本在线查看、保存和执行。
  • 处理历史、日志查看、历史原始数据打包下载。
  • 按 ZIP 文件名数据日期校验本地授权期限,过期后可输入激活码顺延。
  • 系统设置:数据库、远程数据源、Sheet 过滤、字段映射、历史保留、密码修改。
  • 发行形态:Server Portable、Tauri 桌面版、Docker 服务端版。

技术栈

  • 后端:FastAPI + Uvicorn
  • 前端:Vue 3 + TypeScript + Vite + Naive UI
  • 桌面端:Tauri 2 + Python sidecar
  • 数据库:MySQL 8.0+
  • 数据处理:Pandas + OpenPyXL
  • 打包:PyInstaller、Docker、Docker Compose

目录结构

CapaReport/
├─ app/                         # FastAPI 后端源码
│  ├─ api/routers/              # API 路由
│  ├─ services/                 # 授权、远程下载等业务服务
│  ├─ utils/                    # 通用工具
│  ├─ main.py                   # 后端入口和前端托管
│  ├─ processor.py              # 数据处理主流程
│  ├─ database.py               # MySQL 访问
│  ├─ history.py                # 处理历史
│  └─ config.py                 # 配置读写
├─ frontend/                    # Vue 前端
├─ src-tauri/                   # Tauri 桌面壳
├─ scripts/                     # 一键构建脚本
├─ packaging/                   # Docker、Compose、PyInstaller 配置
├─ dist/                        # 一键构建后的最终产物
├─ docs/project_context.md      # 项目维护记录
├─ Configure.json               # 应用配置
├─ ReportScript.sql             # SQL 处理脚本
├─ requirements.txt             # Python 依赖
└─ run.bat                      # Windows 本地启动脚本

本地运行

前置要求:

  • Windows 10/11
  • Python 与 uv
  • Node.js
  • MySQL 8.0+

安装后端依赖:

uv venv
uv pip install -r requirements.txt

安装前端依赖:

cd frontend
npm install
cd ..

启动服务:

.\run.bat

访问地址:

http://localhost:9081

前端开发模式:

cd frontend
npm run dev

Vite 会把 /api 和 /health 代理到 http://localhost:9081。如果 frontend/dist 不存在,run.bat 会自动安装前端依赖并执行构建。

一键构建

Windows 在项目根目录执行:

scripts\build.bat -?

可用目标:

scripts\build.bat server
scripts\build.bat desktop
scripts\build.bat docker
scripts\build.bat all

常用参数:

scripts\build.bat server -NoArchive
scripts\build.bat all -Clean
scripts\build.bat docker -SkipDockerBuild
scripts\build.bat all -SkipDesktopBuild

构建完成后只保留 dist/ 下的最终产物;dist/.tmp、frontend/dist、src-tauri/target、src-tauri/binaries 等中间产物会自动清理。

Server Portable

scripts\build.bat server

输出:

dist\server\CapacityReport-Server-windows-x64\
dist\server\CapacityReport-Server-windows-x64.zip

便携版内包含后端可执行文件、前端构建产物、Configure.json、ReportScript.sql、cache/、logs/ 和启动脚本。默认监听端口为 9081。

桌面版

scripts\build.bat desktop

输出:

dist\desktop\*-setup.exe

桌面版使用 Tauri 启动 Python sidecar。sidecar 默认监听 127.0.0.1:9081,运行数据写入系统 app data 目录,不写入安装目录。

Windows 桌面安装包会内置 WebView2 离线安装器,适合没有外网且未预装 WebView2 Runtime 的机器。该模式会让安装包体积增加约 127 MB;构建机需要能在构建阶段下载 WebView2 离线安装器。 首次启动会把安装包内置的 Configure.json 和 ReportScript.sql 复制到运行数据目录;Windows 下通常是 %APPDATA%\com.nixevol.capacityreport\。安装目录中的 _up_ 只是 Tauri 打包资源目录,程序运行时不会直接编辑它。 Windows 桌面版使用 NSIS 安装器,卸载时会询问是否同时删除 %APPDATA%\com.nixevol.capacityreport\ 中的配置、脚本、授权、缓存和日志。 Windows 桌面版默认安装到 D:\Program Files\CapacityReport;如果没有 D 盘,则默认安装到系统 Program Files\CapacityReport。桌面版已关闭 release DevTools 和右键浏览器菜单。

构建桌面版需要 Rust 和 Tauri CLI。脚本会在缺少 Tauri CLI 时自动执行:

cargo install tauri-cli --locked

Docker 版

scripts\build.bat docker

输出:

capacity-report-app:latest
dist\docker\capacity-report-app-latest.tar
dist\docker\docker-compose.yml
dist\docker\Configure.json
dist\docker\ReportScript.sql

启动:

docker load -i dist\docker\capacity-report-app-latest.tar
docker compose -f dist\docker\docker-compose.yml up -d

访问:

http://localhost:9081

停止:

docker compose -f dist\docker\docker-compose.yml down

Linux / macOS 构建

在对应系统原生环境执行:

sh scripts/build.sh server
sh scripts/build.sh desktop
sh scripts/build.sh docker
sh scripts/build.sh all

Server Portable 和桌面版需要在目标系统原生构建:Windows 包在 Windows 构建,Linux 包在 Linux 构建,macOS 包在 macOS 构建。Docker 镜像可以在 Windows 开发机上构建。

配置说明

Configure.json 主要包含:

  • MySQL_DBInfo:MySQL 连接配置。
  • RemoteData:FTP/SFTP 远程数据源配置。
  • HistoryRetention:处理历史保留配置。
  • SheetFilter:Excel Sheet 过滤规则。
  • ExtractField:字段映射配置。

RemoteData.auto_scheduler 用于远程自动调度:

{
  "enabled": false,
  "check_interval_hours": 1,
  "expected_directories": ["4G/FDD", "4G/900", "5G/2.6", "5G/700"],
  "week_offset": 0
}
  • enabled:是否启用自动调度。
  • check_interval_hours:检查间隔,最小 1 小时。
  • expected_directories:相对 remote_dir 的预期数据目录;为空时按远程 ZIP 实际所在目录检测。
  • week_offset:0 表示上周自然周,-1 表示上上周。

自动调度开启后,系统会强制开启 RemoteData.enabled 和 auto_delete_source。调度器每轮先检查 cache/auto_scheduler/ready.flag;如果标识存在则直接触发远程下载并处理。没有标识时,会按 ZIP 文件名中的第一个时间戳判断每个目录是否覆盖目标自然周 7 天;全部就绪后写入标识,下一个检查周期再启动处理。处理成功并完成远程源文件清理后会删除标识;处理失败或源文件清理失败会保留标识,后续自动重试。

如果配置了 expected_directories,其中某个目录可访问但完全没有 ZIP 文件,会视为该目录已停推并跳过,不再阻塞其他目录;但所有目录都为空时不会触发自动处理。

无论手动上传还是远程下载,处理流程都会按文件名日期对每个目录只保留最近 7 天文件。文件名支持 XXX_YYYYMMDDHHMM_YYYYMMDDHHMM 和 XXX_YYYYMMDDHHMM 两类格式,数据日期始终取第一个时间戳。

登录密码保存在本地 auth.ini,该文件不应提交到版本库。

授权

授权到期日期保存在本地加密文件 license.dat,默认到期日由 app/services/license.py 中的 DEFAULT_EXPIRES_ON 控制,当前为 2026-12-30。处理任务不会读取系统日期,而是从任务目录 ZIP 文件名中的 YYYYMMDDHHMM 或 YYYYMMDDHHMMSS 时间戳取最大日期进行比对。登录后连续点击左上角品牌图标 8 次,可主动打开授权延期窗口。

常用接口

  • POST /api/login:登录
  • POST /api/change-password:修改密码
  • POST /api/upload:上传文件
  • POST /api/remote/test:测试 FTP/SFTP 连接
  • POST /api/remote/start:远程下载并处理
  • GET /api/remote/scheduler/status:查询远程自动调度状态
  • POST /api/remote/scheduler/trigger:手动触发一次自动调度检查
  • POST /api/process/start:启动本地处理
  • POST /api/process/status:查询处理状态
  • GET /api/license/status:查询授权状态
  • POST /api/license/activate:提交激活码并顺延授权期限
  • GET /api/history:处理历史
  • POST /api/history/download:下载历史原始数据
  • GET /health:健康检查

维护注意事项

  • 不要提交 auth.ini、license.dat、cache/、logs/、dist/、frontend/dist/、src-tauri/target/、src-tauri/binaries/。
  • src-tauri/gen/schemas/ 需要保留并提交,src-tauri/capabilities/default.json 的 JSON schema 会引用它。
  • ReportScript.sql 是业务处理链路的一部分,修改前需要确认 SQL 语义和字段映射兼容。
S
Description
No description provided
Readme
5.1 MiB
Languages
Python 53.6%
Vue 34.5%
CSS 6.4%
TypeScript 3.5%
Rust 1.6%
Other 0.4%