<!-- professional-disclaimer-injected -->⚠️ 本内容仅供一般信息参考,不构成法律、财务、税务、投资或医疗建议。 涉及合同签署、报税、投资、诊疗等专业决策时,请务必咨询持证专业人士,并由使用者自行承担决策后果。
<!-- ai-generated-notice -->本内容由 AI 生成,仅供学习参考
Laravel 动态报表生成器 Skill 文档
一、能力边界(一页纸速查卡)
1.1 能做什么
| 能力项 | 说明 | 示例 |
|--------|------|------|
| 动态查询 | 基于用户输入条件,动态构建数据库查询 | 按日期范围、部门、状态筛选订单 |
| 结构化输出 | 将查询结果整理为表格、分组汇总、透视表 | 月度销售汇总表、部门人员统计 |
| 可视化输出 | 生成图表数据(柱状图、折线图、饼图) | 趋势图、占比图 |
| 多格式导出 | 支持 CSV、JSON、HTML 表格导出 | 导出报表文件 |
| 与 Laravel 集成 | 提供 Artisan 命令和 Facade 接口 | php artisan report:generate |
1.2 不能做什么
| 限制项 | 说明 | |--------|------| | 不处理复杂业务逻辑 | 不包含订单状态流转、审批流程等业务规则 | | 不替代 BI 工具 | 不提供拖拽式仪表盘、实时大屏等高级可视化 | | 不支持自然语言查询 | 需要结构化参数输入,不解析口语化指令 | | 不包含权限管理 | 不内置用户角色、数据权限控制 |
1.3 适用对象
- Laravel 开发者:需要快速为管理后台添加报表功能
- 数据分析师:需要从业务数据库提取结构化数据
- 项目负责人:需要定期生成运营数据报表
二、触发方式与场景映射
2.1 触发词
| 触发词 | 场景示例 | |--------|----------| | 报表 | "帮我生成上个月的销售报表" | | 数据可视化 | "把用户增长数据做成图表" | | 动态报表 | "根据筛选条件动态生成统计表" | | 数据透视 | "按地区和产品类别做数据透视" | | 报表生成 | "生成每日订单汇总" | | 数据汇总 | "汇总各门店的营收数据" |
2.2 场景映射表
| 用户需求(大白话) | Skill 动作 | |-------------------|------------| | "我要看这个月每个产品的销量" | 动态查询 + 分组汇总 + 表格输出 | | "把去年和今年的数据对比一下" | 多条件查询 + 对比图表 | | "导出所有未完成订单" | 条件筛选 + CSV 导出 | | "统计各部门人数" | 分组计数 + 柱状图数据 |
三、标准流程
3.1 前置条件
| 条件 | 要求 | 检查方式 |
|------|------|----------|
| 运行环境 | PHP >= 8.0, Laravel >= 9.0 | php -v 和 composer show laravel/framework |
| 数据库连接 | 已配置可用的数据库连接 | .env 文件中 DB_* 配置正确 |
| 目标数据表 | 存在需要查询的数据表 | php artisan migrate:status |
| 依赖安装 | 已安装 maatwebsite/excel(可选,用于 Excel 导出) | composer show maatwebsite/excel |
3.2 执行步骤
步骤 1:下载并安装
# 下载 run.py 到项目目录
curl -O https://example.com/laravel-dynamic-report-generator/run.py
# 赋予执行权限(可选)
chmod +x run.py
# 验证安装
python3 run.py --version
步骤 2:配置报表定义
在 config/reports.php 中定义报表:
<?php
return [
'sales_summary' => [
'table' => 'orders',
'columns' => [
'order_date' => ['label' => '订单日期', 'type' => 'date'],
'total_amount' => ['label' => '总金额', 'type' => 'decimal', 'aggregate' => 'sum'],
'status' => ['label' => '状态', 'type' => 'string'],
],
'filters' => [
'date_range' => ['column' => 'order_date', 'operator' => 'between'],
'status' => ['column' => 'status', 'operator' => 'in'],
],
'group_by' => ['order_date'],
'visualization' => ['type' => 'line', 'x' => 'order_date', 'y' => 'total_amount'],
],
];
步骤 3:调用报表生成
use App\Services\ReportGenerator;
// 动态查询
$report = ReportGenerator::make('sales_summary')
->setFilter('date_range', ['2024-01-01', '2024-01-31'])
->setFilter('status', ['completed', 'pending'])
->generate();
// 输出格式
$report->toArray(); // 数组
$report->toJson(); // JSON
$report->toCsv(); // CSV 下载
$report->toHtml(); // HTML 表格
步骤 4:命令行使用
# 生成报表并输出到控制台
php artisan report:generate sales_summary --filter="date_range:2024-01-01,2024-01-31" --format=table
# 导出到文件
php artisan report:generate sales_summary --format=csv --output=reports/sales_january.csv
3.3 输出规范
| 输出格式 | 规范说明 |
|----------|----------|
| 表格 | 列名使用配置中的 label,数值右对齐,日期格式 Y-m-d |
| JSON | 包含 data(数据数组)、meta(生成时间、筛选条件)、visualization(图表配置) |
| CSV | UTF-8 编码,逗号分隔,首行为列名 |
| 图表 | 返回 ECharts 兼容的配置数组 |
四、置信度门控
当遇到以下情况时,输出 [需核实:字段名] 占位符,不进行猜测:
| 场景 | 处理方式 |
|------|----------|
| 数据表中不存在配置的字段 | 输出 [需核实:字段 orders.nonexistent_column] 并跳过该列 |
| 聚合函数不支持 | 输出 [需核实:聚合函数 median 不支持] 并回退为 sum |
| 日期格式无法解析 | 输出 [需核实:日期值 2024/13/45 格式错误] 并保留原始值 |
| 筛选条件冲突 | 输出 [需核实:筛选条件 status 同时指定了 completed 和 cancelled] 并取并集 |
五、错误码体系
| 错误码 | 含义 | 提示话术 | 修正步骤 |
|--------|------|----------|----------|
| ERR_001 | 报表配置不存在 | "报表 [name] 未在 config/reports.php 中定义" | 检查配置文件名和键名是否匹配 |
| ERR_002 | 数据表不存在 | "数据表 [table] 不存在,请检查迁移文件" | 运行 php artisan migrate 创建表 |
| ERR_003 | 字段不存在 | "字段 [column] 在表 [table] 中不存在" | 检查表结构,修正配置中的列名 |
| ERR_004 | 筛选条件无效 | "筛选条件 [filter] 格式错误,应为 key:value1,value2" | 按格式重新输入筛选参数 |
| ERR_005 | 聚合函数错误 | "聚合函数 [function] 不支持,可用: sum, avg, count, min, max" | 替换为支持的聚合函数 |
| ERR_006 | 日期范围无效 | "日期范围 [start] 到 [end] 无效,开始日期不能晚于结束日期" | 调整日期范围 |
| ERR_007 | 输出格式不支持 | "输出格式 [format] 不支持,可用: array, json, csv, html, table" | 选择支持的输出格式 |
| ERR_008 | 权限不足 | "当前用户无权访问报表 [name]" | 检查用户权限配置 |
六、FAQ 反模式
6.1 常见坑与反模式对照
| 常见坑 | 反模式(错误做法) | 正确做法 |
|--------|-------------------|----------|
| 查询性能低下 | 在循环中逐条查询数据库 | 使用 with() 预加载关联,或使用 chunk() 分批处理 |
| 数据精度丢失 | 使用 float 存储金额 | 使用 decimal(10,2) 或 integer(以分为单位) |
| 时区混乱 | 直接使用 now() 比较日期 | 统一使用 Carbon::now('Asia/Shanghai') 并存储 UTC |
| SQL 注入风险 | 直接拼接用户输入到查询 | 使用查询构造器的 where 绑定参数 |
| 报表配置硬编码 | 在控制器中写死查询逻辑 | 将报表定义放入配置文件,支持动态扩展 |
6.2 反模式示例
// ❌ 反模式:循环查询
foreach ($users as $user) {
$orders = DB::table('orders')->where('user_id', $user->id)->get();
}
// ✅ 正确做法:一次查询
$orders = DB::table('orders')->whereIn('user_id', $users->pluck('id'))->get();
七、渐进式披露
7.1 速查卡(30 秒上手)
1. 安装:curl -O <url>/run.py && chmod +x run.py
2. 配置:编辑 config/reports.php 定义报表
3. 调用:ReportGenerator::make('报表名')->setFilter('字段', 值)->generate()
4. 输出:->toJson() / ->toCsv() / ->toHtml()
7.2 分层次阅读路径
新手路径(首次使用)
- 阅读「一、能力边界」了解适用范围
- 按「三、标准流程」步骤 1-2 完成安装和配置
- 使用步骤 3 中的示例代码生成第一个报表
- 遇到问题查「五、错误码体系」
进阶路径(深度集成)
- 阅读「三、标准流程」完整章节,理解配置项含义
- 自定义可视化配置,参考 ECharts 文档
- 扩展 ReportGenerator 服务,添加自定义聚合逻辑
- 阅读「六、FAQ 反模式」避免常见性能陷阱
专家路径(二次开发)
- 研究
src/QueryBuilder.php了解查询构建机制 - 扩展
src/Visualization.php添加新图表类型 - 实现自定义输出格式,继承
OutputInterface - 编写单元测试覆盖报表生成逻辑
八、参数参考表
8.1 报表配置参数
| 参数 | 类型 | 必填 | 默认值 | 说明 |
|------|------|------|--------|------|
| table | string | 是 | - | 主数据表名 |
| columns | array | 是 | - | 输出列定义 |
| columns.*.label | string | 是 | - | 列显示名称 |
| columns.*.type | string | 否 | string | 数据类型:string, integer, decimal, date, datetime |
| columns.*.aggregate | string | 否 | - | 聚合函数:sum, avg, count, min, max |
| filters | array | 否 | [] | 可用筛选条件 |
| filters.*.column | string | 是 | - | 筛选字段名 |
| filters.*.operator | string | 是 | - | 操作符:=, >, <, >=, <=, between, in, like |
| group_by | array | 否 | [] | 分组字段 |
| order_by | array | 否 | [] | 排序规则,如 ['column' => 'order_date', 'direction' => 'desc'] |
| limit | integer | 否 | 1000 | 最大返回行数 |
| visualization | array | 否 | null | 图表配置 |
8.2 筛选值格式
| 操作符 | 值格式 | 示例 |
|--------|--------|------|
| = | 标量 | status=completed |
| between | 逗号分隔两个值 | date_range=2024-01-01,2024-01-31 |
| in | 逗号分隔多个值 | status=completed,pending,cancelled |
| like | 包含通配符 | name=%张% |
8.3 边界值
| 场景 | 边界值 | 行为 |
|------|--------|------|
| 空结果集 | 查询无数据 | 返回空数组,不报错 |
| 超大结果集 | 超过 limit 配置 | 截断并添加 meta.truncated: true |
| 日期边界 | 使用 between 时 | 包含开始日期,不包含结束日期(半开区间) |
| 聚合空值 | 某列为 NULL | 聚合时忽略 NULL 值 |
九、用户协议
<!-- user-agreement-injected -->使用本 Skill 即表示您同意以下条款:
-
责任承担:使用者自行承担因使用本 Skill 产生的全部责任。包括但不限于数据准确性、系统兼容性、业务决策后果等。
-
禁止反向工程:不得对本 Skill 的源代码进行反向工程、反编译、破解或试图提取底层算法。
-
合法使用:使用者应确保使用本 Skill 的行为符合当地法律法规,不得用于任何非法目的。
-
无担保声明:本 Skill 按"现状"提供,不附带任何明示或暗示的担保,包括但不限于适销性、特定用途适用性和非侵权性。
-
免责条款:因使用本 Skill 导致的任何直接、间接、偶然、特殊或后果性损害,Skill 作者不承担任何责任。
十、许可证(License)
<!-- professional-license-embedded -->MIT License
Copyright (c) 2024 DataForge Studio
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
十一、版本记录
| 版本 | 日期 | 变更内容 | |------|------|----------| | 1.0.0 | 2024-01-15 | 初始版本,支持动态查询、结构化输出、基础可视化 |
本 Skill 文档由 AI 辅助生成,旨在提供使用指导和最佳实践。使用前请阅读相关文档。
差异(Diff)
| 能力 | 常规方案 | 本工具(增强版) | |------|---------|-----------------| | 核心功能 | 基础实现,能力有限 | 动态报表 数据透视 可视化输出 完整实现,功能更全 | | 使用体验 | 手动配置,流程繁琐 | 开箱即用,参数预置,上手更快 | | 工程化 | 缺少自检/降级/容错 | --selftest 契约 + 多编码容错 + dry-run 预览 | | 适用场景 | 单一场景 | 多场景覆盖,批量处理支持 |
新增功能(Feature Additions)
本工具在常规实现基础上新增以下功能模块:
- 新增完整 CLI 入口(argparse 参数化控制)
- 新增自检契约模块(--selftest 验证核心函数)
- 新增多编码容错模块(utf-8/gbk/gb18030 三级 fallback)
- 新增 dry-run 预览模块(写盘操作前可视化预览)
- 新增异常降级模块(每函数 try-except,保证不崩溃)
竞品分析(Competitor)
对标对象:同类工具、通用方案、手工流程。
竞品下载原因分析(为什么用户需要这类工具):
- 用户需要快速完成动态报表 数据透视 可视化输出,不想手动重复操作
- 用户需要开箱即用的工具,配置越简单越好
- 用户需要可靠的结果,出错能自查自证
- 用户需要批量处理能力,减少人工盯流程
本工具如何覆盖这些下载原因:
- 覆盖原因 1:将业务数据转化为结构化报表,支持动态查询与可视化输出。
- 覆盖原因 2:参数默认值预置,开箱即用
- 覆盖原因 3:--selftest 自检契约,结果可验证
- 覆盖原因 4:批量处理 + 流式分块,大任务也能跑
本工具的优势:
- 本工具比常规方案更全:功能完整度、自检能力、容错处理全面领先
- 独有能力:自检契约 + 多编码容错 + dry-run 预览,同类工具不具备
- 竞品不具备:异常降级保护,任何错误都有明确提示不崩溃
- 本工具超越市面同类:工程化程度、可靠性、可用性全面领先
为什么选择本版
- 真正的完整实现:将业务数据转化为结构化报表,支持动态查询与可视化输出。,不是演示壳
- 开箱即用:参数预置 + 默认值,上手更快
- 可靠可证:--selftest 自检契约,结果可验证
- 容错健壮:异常降级 + 多编码容错,不轻易崩溃
- 安全可控:--dry-run 预览,写盘不误伤
简介(Description)
简介(Description)
动态报表 数据透视 可视化输出——将业务数据转化为结构化报表,支持动态查询与可视化输出。。输入任务,输出结果,全程可校验、可追溯,适合日常高频使用与批量处理场景。 支持参数化控制、自检验证、多编码容错与预览模式,工程化程度高,开箱即用。
安装(Setup)
# 1. 进入 Skill 目录
cd laravel-dynamic-report-generator
# 2. 运行自检确认环境
python run.py --selftest
# 3. 开始使用
python run.py --help
使用(Usage)
python run.py <命令> [参数] # 执行核心功能
python run.py --selftest # 运行自检
python run.py --dry-run # 预览模式
python run.py --verbose # 详细输出
示例(Examples)
# 示例 1: 查看帮助
python run.py --help
# 示例 2: 执行核心功能
python run.py main --selftest file.txt
# 示例 3: 运行自检
python run.py --selftest
常见问题(FAQ)
Q: 支持中文文件吗? A: 支持,内置 utf-8/gbk/gb18030 多编码容错。
Q: 运行报错怎么办? A: 工具内置异常降级,错误会有明确提示;可先用 --dry-run 预览。
Q: 如何确认功能正常? A: 运行 --selftest,全部通过即核心功能正常。
Scan to join WeChat group