From 32e74d0f43e61f9e99d679da521251589cba2379 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B5=B5=E4=B9=89=E4=BB=91?= Date: Wed, 24 Jun 2026 09:45:35 +0800 Subject: [PATCH] chore: prepare docfill project for gitea --- HOWTO.md | 725 ++++++++++++++++++ README.md | 281 ++++--- cmd/docfill/main.go | 56 +- cmd/docfill/main_test.go | 92 ++- docs/digital-employee-runbook.md | 137 +++- .../evaluations/2026-06-19-full-evaluation.md | 186 +++++ .../2026-06-18-docfill-p0.7-errors-logs.md | 52 ++ examples/README.md | 30 +- examples/excel-filter-to-word/task.json | 25 + internal/docfill/docfill.go | 387 ++++++++-- internal/docfill/docfill_test.go | 24 + internal/docfill/errors.go | 74 ++ internal/docfill/p0_test.go | 300 ++++++++ .../daily_report_template.docx | Bin 0 -> 36971 bytes .../out/daily_2026-06-18_张三_测试_1.docx | Bin 0 -> 41901 bytes .../out/daily_2026-06-18_李四_2.docx | Bin 0 -> 41899 bytes .../01_excel_to_word/source_daily_data.xlsx | Bin 0 -> 5477 bytes manual_tests/01_excel_to_word/task.json | 19 + .../department_summary_template.xlsx | Bin 0 -> 5299 bytes .../out/summary_客服部_1.xlsx | Bin 0 -> 7071 bytes .../out/summary_营销部_2.xlsx | Bin 0 -> 7077 bytes .../02_sqlite_to_excel/source_summary.db | Bin 0 -> 8192 bytes manual_tests/02_sqlite_to_excel/task.json | 20 + .../03_excel_to_excel/audit_template.xlsx | Bin 0 -> 5289 bytes .../out/audit_2026-06-18_王五_1.xlsx | Bin 0 -> 7112 bytes .../out/audit_2026-06-18_赵六_2.xlsx | Bin 0 -> 7121 bytes .../03_excel_to_excel/source_audit_data.xlsx | Bin 0 -> 5378 bytes manual_tests/03_excel_to_excel/task.json | 18 + .../out/work_order_2026-06-18_GD-002.docx | Bin 0 -> 41819 bytes .../source_work_orders.xlsx | Bin 0 -> 5476 bytes .../04_filter_work_order_to_word/task.json | 25 + .../work_order_template.docx | Bin 0 -> 36945 bytes manual_tests/README.md | 131 ++++ .../_evaluation_rendered/daily/page-1.png | Bin 0 -> 84549 bytes .../_evaluation_rendered/filter/page-1.png | Bin 0 -> 67984 bytes scripts/make-manual-test-materials.py | 473 ++++++++++++ scripts/smoke-fixtures/main.go | 19 + scripts/smoke.sh | 3 + 38 files changed, 2915 insertions(+), 162 deletions(-) create mode 100644 HOWTO.md create mode 100644 docs/evaluations/2026-06-19-full-evaluation.md create mode 100644 docs/superpowers/plans/2026-06-18-docfill-p0.7-errors-logs.md create mode 100644 examples/excel-filter-to-word/task.json create mode 100644 internal/docfill/errors.go create mode 100644 manual_tests/01_excel_to_word/daily_report_template.docx create mode 100644 manual_tests/01_excel_to_word/out/daily_2026-06-18_张三_测试_1.docx create mode 100644 manual_tests/01_excel_to_word/out/daily_2026-06-18_李四_2.docx create mode 100644 manual_tests/01_excel_to_word/source_daily_data.xlsx create mode 100644 manual_tests/01_excel_to_word/task.json create mode 100644 manual_tests/02_sqlite_to_excel/department_summary_template.xlsx create mode 100755 manual_tests/02_sqlite_to_excel/out/summary_客服部_1.xlsx create mode 100755 manual_tests/02_sqlite_to_excel/out/summary_营销部_2.xlsx create mode 100644 manual_tests/02_sqlite_to_excel/source_summary.db create mode 100644 manual_tests/02_sqlite_to_excel/task.json create mode 100644 manual_tests/03_excel_to_excel/audit_template.xlsx create mode 100755 manual_tests/03_excel_to_excel/out/audit_2026-06-18_王五_1.xlsx create mode 100755 manual_tests/03_excel_to_excel/out/audit_2026-06-18_赵六_2.xlsx create mode 100644 manual_tests/03_excel_to_excel/source_audit_data.xlsx create mode 100644 manual_tests/03_excel_to_excel/task.json create mode 100644 manual_tests/04_filter_work_order_to_word/out/work_order_2026-06-18_GD-002.docx create mode 100644 manual_tests/04_filter_work_order_to_word/source_work_orders.xlsx create mode 100644 manual_tests/04_filter_work_order_to_word/task.json create mode 100644 manual_tests/04_filter_work_order_to_word/work_order_template.docx create mode 100644 manual_tests/README.md create mode 100644 manual_tests/_evaluation_rendered/daily/page-1.png create mode 100644 manual_tests/_evaluation_rendered/filter/page-1.png create mode 100644 scripts/make-manual-test-materials.py diff --git a/HOWTO.md b/HOWTO.md new file mode 100644 index 0000000..7c5a02a --- /dev/null +++ b/HOWTO.md @@ -0,0 +1,725 @@ +# docfill HOWTO + +本文档说明如何使用 `docfill` 完成本地文档自动填充。文档分为两部分: + +- “最小实践”用于快速完成一次可验证运行。 +- “详细说明”用于理解任务配置、运行变量、筛选、模板、输出、错误和日志。 + +## 一、最小实践 + +### 1. 进入项目目录 + +```bash +cd /Users/zhaoyilun/Documents/xls_doc +``` + +### 2. 构建命令行工具 + +```bash +bash scripts/build.sh +``` + +输出示例: + +```text +/Users/zhaoyilun/Documents/xls_doc/dist/docfill-darwin-arm64 +``` + +构建后的可执行文件是: + +```text +dist/docfill-darwin-arm64 +``` + +### 3. 准备测试素材 + +仓库中已经包含 `manual_tests/` 测试素材。如果需要重新生成,可执行: + +```bash +/Users/zhaoyilun/.cache/codex-runtimes/codex-primary-runtime/dependencies/python/bin/python3 scripts/make-manual-test-materials.py +``` + +输出示例: + +```text +/Users/zhaoyilun/Documents/xls_doc/manual_tests +``` + +测试素材包含四类任务: + +- `manual_tests/01_excel_to_word`: Excel 源数据生成 Word 日报。 +- `manual_tests/02_sqlite_to_excel`: SQLite 源数据生成 Excel 汇总表。 +- `manual_tests/03_excel_to_excel`: Excel 源数据生成 Excel 质检表。 +- `manual_tests/04_filter_work_order_to_word`: 按日期和工单编号筛选一条工单,再生成 Word。 + +### 4. 运行筛选工单案例 + +命令: + +```bash +dist/docfill-darwin-arm64 run -c manual_tests/04_filter_work_order_to_word/task.json --var date=2026-06-18 --var ticket_no=GD-002 --verbose +``` + +输出示例: + +```text +log: load config path=manual_tests/04_filter_work_order_to_word/task.json +log: read data type=excel path=/Users/zhaoyilun/Documents/xls_doc/manual_tests/04_filter_work_order_to_word/source_work_orders.xlsx +log: read data type=excel path=/Users/zhaoyilun/Documents/xls_doc/manual_tests/04_filter_work_order_to_word/source_work_orders.xlsx rows=3 +log: filter rows=3 matched=1 expect=one +log: render row=1 output=/Users/zhaoyilun/Documents/xls_doc/manual_tests/04_filter_work_order_to_word/out/work_order_2026-06-18_GD-002.docx +generated 1 file(s) +- /Users/zhaoyilun/Documents/xls_doc/manual_tests/04_filter_work_order_to_word/out/work_order_2026-06-18_GD-002.docx +``` + +查看输出目录: + +```bash +open manual_tests/04_filter_work_order_to_word/out +``` + +输入 Excel 内容示例: + +```text +日期 工单编号 客户名称 系统来源 处理结果 下一步 +2026-06-18 GD-001 A 公司 PMS3.0 已派单 等待现场反馈 +2026-06-18 GD-002 B 公司 D5000 已完成 归档并同步日报 +2026-06-19 GD-001 C 公司 风控平台 待复核 补充截图 +``` + +本次命令传入: + +```text +date = 2026-06-18 +ticket_no = GD-002 +``` + +所以工具会筛选: + +```text +日期 = 2026-06-18,并且 工单编号 = GD-002 +``` + +最终只生成 `GD-002` 对应的 Word 文件。 + +## 二、详细说明 + +### 1. task.json 与 --var 的关系 + +`task.json` 是某一种业务报表的固定任务说明书。它通常由开发人员或维护人员准备好,普通运行时不需要频繁修改。 + +命令行 `--var` 是本次运行传入的具体条件,例如日期、工单编号、人员、批次。 + +可以这样理解: + +```text +不同业务 = 不同 task.json +本次运行的具体条件 = --var +真实业务数据 = Excel 或 SQLite +输出模板 = Word 或 Excel +``` + +例如不同业务可以分别维护: + +```text +工单日报.json +部门汇总.json +质检报告.json +``` + +运行时只传本次变化的信息: + +```bash +dist/docfill-darwin-arm64 run -c 工单日报.json --var date=2026-06-18 --var ticket_no=GD-002 +``` + +变量优先级: + +```text +数据表里的字段 > 命令行 --var > task.json 里的 vars +``` + +示例: + +```json +"vars": { + "date": "2026-06-18" +} +``` + +如果运行时执行: + +```bash +dist/docfill-darwin-arm64 run -c task.json --var date=2026-06-19 +``` + +实际使用的是: + +```text +date = 2026-06-19 +``` + +也就是命令行 `--var` 会覆盖 `task.json` 中的同名默认变量。 + +### 2. 命令格式 + +`docfill` 当前只提供一个核心命令: + +```bash +dist/docfill-darwin-arm64 run -c [--var key=value] [--verbose] +``` + +参数说明: + +| 参数 | 作用 | 示例 | +| --- | --- | --- | +| `run` | 执行一次填充任务 | `dist/docfill-darwin-arm64 run -c task.json` | +| `-c` | 指定任务配置文件 | `-c manual_tests/04_filter_work_order_to_word/task.json` | +| `--config` | `-c` 的完整写法 | `--config task.json` | +| `--var` | 传入运行时变量,可以重复使用 | `--var date=2026-06-18 --var ticket_no=GD-002` | +| `--verbose` | 输出诊断日志到 stderr | `--verbose` | + +命令行参数错误示例: + +```bash +dist/docfill-darwin-arm64 run --var date +``` + +输出示例: + +```text +docfill: [CLI_USAGE] invalid value "date" for flag -var: invalid --var "date", want key=value +hint: Check command flags and use key=value for --var. +``` + +### 3. 任务配置结构 + +典型的筛选任务配置如下: + +```json +{ + "vars": { + "date": "2026-06-18" + }, + "data": { + "type": "excel", + "path": "./source_work_orders.xlsx", + "sheet": "工单", + "header_row": 1 + }, + "filter": { + "equals": { + "日期": "{{date}}", + "工单编号": "{{ticket_no}}" + }, + "expect": "one" + }, + "template": { + "path": "./work_order_template.docx" + }, + "output": { + "path": "./out/work_order_{{日期}}_{{工单编号}}.docx", + "overwrite": true + } +} +``` + +配置字段说明: + +| 字段 | 必填 | 说明 | +| --- | --- | --- | +| `vars` | 否 | 默认变量。适合放日期、批次、班次等默认值。 | +| `data.type` | 是 | 数据源类型。支持 `excel`、`xlsx`、`sqlite`。 | +| `data.path` | 是 | 数据源路径。支持 `.xlsx` 或 SQLite `.db`。 | +| `data.sheet` | Excel 可选 | Excel 工作表名称。未填写时读取第一个工作表。 | +| `data.header_row` | Excel 可选 | Excel 表头行号,从 `1` 开始。未填写时默认为 `1`。 | +| `data.query` | SQLite 必填 | SQLite 查询语句。查询结果列名作为字段名。 | +| `data.params` | SQLite 可选 | SQL `?` 参数列表,支持 `{{变量名}}`。 | +| `filter.equals` | 否 | 等值筛选条件。左侧是数据字段,右侧是匹配值。 | +| `filter.expect` | 否 | 筛选结果数量要求。支持 `one`、`many`,默认 `one`。 | +| `template.path` | 是 | Word 或 Excel 模板路径。支持 `.docx`、`.xlsx`。 | +| `output.path` | 是 | 输出文件路径模板。可以使用 `{{字段名}}`。 | +| `output.overwrite` | 否 | 是否覆盖已存在文件。默认是 `false`。 | + +相对路径规则: + +```text +task.json 所在目录就是相对路径的基准目录。 +``` + +### 4. 业务筛选 filter + +`filter` 的作用是从数据表中筛选出本次要使用的数据行。它的目标不是提供数据库查询能力,而是提供符合表格使用习惯的简单筛选。 + +配置示例: + +```json +"filter": { + "equals": { + "日期": "{{date}}", + "工单编号": "{{ticket_no}}" + }, + "expect": "one" +} +``` + +含义: + +```text +找到 日期 等于 date,并且 工单编号 等于 ticket_no 的数据行。 +``` + +命令: + +```bash +dist/docfill-darwin-arm64 run -c task.json --var date=2026-06-18 --var ticket_no=GD-002 +``` + +实际筛选: + +```text +日期 = 2026-06-18 +工单编号 = GD-002 +``` + +筛选规则: + +- `filter.equals` 左侧必须是 Excel 表头或 SQLite 查询结果列名。 +- `filter.equals` 右侧可以写固定值,也可以写 `{{变量名}}`。 +- 多个条件之间是“全部满足”关系。 +- 比较前会去掉单元格值和筛选值两侧的空格。 +- 只支持等值匹配。 +- 不支持模糊匹配、范围查询、OR、排序表达式或复杂条件。 + +`filter.expect` 支持两个值: + +| 值 | 含义 | 适用场景 | +| --- | --- | --- | +| `one` | 必须只匹配一行 | 工单、单份日报、单个报表。 | +| `many` | 允许匹配多行 | 按日期批量生成多个人或多个部门的报表。 | + +未填写 `filter.expect` 时,默认按 `one` 处理。 + +如果没有配置 `filter`,工具会沿用旧行为:读取到的每一行都会生成一个输出文件。 + +复杂情况的处理建议: + +- 如果多个字段才能确定一条数据,就在 `filter.equals` 中写多个条件。 +- 如果表格本身不容易筛选,建议在 Excel 中新增辅助列,例如 `填报批次`、`业务唯一标识`、`筛选日期`。 +- 不建议把复杂业务规则写进 `docfill`,复杂规则应在数据准备阶段完成。 + +### 5. Excel 数据源 + +Excel 数据源配置示例: + +```json +{ + "data": { + "type": "excel", + "path": "./source_work_orders.xlsx", + "sheet": "工单", + "header_row": 1 + } +} +``` + +运行示例: + +```bash +dist/docfill-darwin-arm64 run -c manual_tests/04_filter_work_order_to_word/task.json --var date=2026-06-18 --var ticket_no=GD-002 +``` + +Excel 读取规则: + +- `header_row` 指定表头行,表头单元格内容就是字段名。 +- 表头下方的每一行是候选数据。 +- 配置了 `filter` 时,先筛选,再生成输出。 +- 未配置 `filter` 时,每一行都会生成一个输出文件。 +- 空行会被跳过。 +- 空表头列会被忽略。 + +表头在第 1 行的输入示例: + +```text +日期 工单编号 客户名称 系统来源 处理结果 下一步 +2026-06-18 GD-001 A 公司 PMS3.0 已派单 等待现场反馈 +2026-06-18 GD-002 B 公司 D5000 已完成 归档并同步日报 +2026-06-19 GD-001 C 公司 风控平台 待复核 补充截图 +``` + +表头在第 2 行的配置示例: + +```json +{ + "data": { + "type": "excel", + "path": "./source_audit_data.xlsx", + "sheet": "Audit", + "header_row": 2 + } +} +``` + +对应输入示例: + +```text +日报质检导出 + +employee date item score comment +王五 2026-06-18 日报完整性 92 字段齐全,说明清楚 +赵六 2026-06-18 系统截图一致性 87 缺少 1 张截图,需要补充 +``` + +### 6. SQLite 数据源 + +SQLite 数据源配置示例: + +```json +{ + "vars": { + "date": "2026-06-18" + }, + "data": { + "type": "sqlite", + "path": "./source_summary.db", + "query": "select department, report_date, total_count, abnormal_count, owner from department_summary order by department", + "params": [] + }, + "filter": { + "equals": { + "report_date": "{{date}}" + }, + "expect": "many" + } +} +``` + +运行示例: + +```bash +dist/docfill-darwin-arm64 run -c manual_tests/02_sqlite_to_excel/task.json --var date=2026-06-18 +``` + +SQLite 读取规则: + +- `data.query` 的查询结果列名就是模板字段名。 +- `data.params` 按顺序对应 SQL 中的 `?`。 +- `data.params` 可以引用 `vars` 或命令行 `--var`。 +- 配置了 `filter` 时,SQL 查询结果还会再经过业务筛选。 +- 查询结果的每一行或筛选后的每一行生成一个输出文件。 + +输入数据示例: + +```text +department report_date total_count abnormal_count owner +营销部 2026-06-17 115 2 张三 +客服部 2026-06-18 76 0 李四 +营销部 2026-06-18 128 3 张三 +``` + +SQLite 可以继续使用 SQL 参数: + +```json +"data": { + "type": "sqlite", + "path": "./source_summary.db", + "query": "select department, report_date, total_count, abnormal_count, owner from department_summary where report_date = ? order by department", + "params": ["{{date}}"] +} +``` + +这适合由开发人员维护的 SQLite 数据源。面向表格使用习惯时,优先使用 `filter.equals` 表达业务筛选。 + +### 7. Word 模板 + +Word 模板使用 `.docx` 文件,模板中写入 `{{字段名}}`: + +```text +日期:{{日期}} +工单编号:{{工单编号}} +客户名称:{{客户名称}} +系统来源:{{系统来源}} +处理结果:{{处理结果}} +下一步:{{下一步}} +``` + +运行示例: + +```bash +dist/docfill-darwin-arm64 run -c manual_tests/04_filter_work_order_to_word/task.json --var date=2026-06-18 --var ticket_no=GD-002 +``` + +生成结果示例: + +```text +日期:2026-06-18 +工单编号:GD-002 +客户名称:B 公司 +系统来源:D5000 +处理结果:已完成 +下一步:归档并同步日报 +``` + +Word 支持同一段落内被 Word 拆分的文本占位符。例如模板内部可能把 `{{name}}` 拆成相邻文本节点 `{{na` 和 `me}}`,工具会按同一段落进行最小兼容处理。 + +这种兼容会把同一段落内的拆分文本合并后再写回,渲染结果会写入该段落第一个文本节点的位置,后续拆分节点的独立格式不再体现。建议模板中每个占位符使用同一种字体、颜色和加粗状态,不要在 `{{`、字段名、`}}` 之间混用格式。 + +当前不支持复杂模板语法,例如表格循环、条件判断、图片插入、跨段落拼接占位符。 + +### 8. Excel 模板 + +Excel 模板使用 `.xlsx` 文件,单元格中写入 `{{字段名}}`: + +```text +B2: {{department}} +B3: {{report_date}} +B4: {{owner}} +B5: {{total_count}} +B6: {{abnormal_count}} +``` + +运行示例: + +```bash +dist/docfill-darwin-arm64 run -c manual_tests/02_sqlite_to_excel/task.json --var date=2026-06-18 +``` + +生成结果示例: + +```text +B2: 营销部 +B3: 2026-06-18 +B4: 张三 +B5: 128 +B6: 3 +``` + +Excel 模板会遍历所有工作表,替换单元格文本中的占位符。当前不支持公式重算、透视表刷新、复杂样式模板语法。 + +### 9. 输出路径 + +输出路径可以使用字段占位符: + +```json +{ + "output": { + "path": "./out/work_order_{{日期}}_{{工单编号}}.docx", + "overwrite": true + } +} +``` + +运行示例: + +```bash +dist/docfill-darwin-arm64 run -c manual_tests/04_filter_work_order_to_word/task.json --var date=2026-06-18 --var ticket_no=GD-002 +``` + +输出文件示例: + +```text +work_order_2026-06-18_GD-002.docx +``` + +文件名清理规则: + +```text +/ \ : * ? " < > | +``` + +以上字符会在输出路径字段值中替换为 `_`。例如: + +```text +张三/测试 -> 张三_测试 +``` + +覆盖规则: + +- `output.overwrite` 未设置或为 `false` 时,输出文件已存在会失败。 +- `output.overwrite` 为 `true` 时,允许覆盖同名输出文件。 + +### 10. 日志、标准输出和退出码 + +成功时,stdout 输出生成文件清单: + +```text +generated 1 file(s) +- /path/to/out/work_order_2026-06-18_GD-002.docx +``` + +启用 `--verbose` 后,stderr 输出诊断日志: + +```text +log: load config path=task.json +log: read data type=excel path=/path/data.xlsx +log: read data type=excel path=/path/data.xlsx rows=3 +log: filter rows=3 matched=1 expect=one +log: render row=1 output=/path/out/work_order_2026-06-18_GD-002.docx +``` + +退出码: + +| 退出码 | 含义 | 适用场景 | +| --- | --- | --- | +| `0` | 成功 | 可以读取 stdout 中的生成文件清单。 | +| `1` | 执行失败 | 配置、数据、模板、输出等处理失败。 | +| `2` | 命令行错误 | 参数缺失、命令错误、`--var` 格式错误。 | + +数字员工或调度脚本建议: + +- 判断退出码确认任务是否成功。 +- 成功时读取 stdout 获取生成文件路径。 +- 失败时记录 stderr,用于定位错误码、提示和上下文。 +- 仅在诊断或审计时启用 `--verbose`。 + +### 11. 错误格式与错误码 + +错误输出格式: + +```text +docfill: [ERROR_CODE] message +hint: repair suggestion +context: key=value +``` + +配置文件不存在示例: + +```bash +dist/docfill-darwin-arm64 run -c manual_tests/not-exist.json +``` + +输出示例: + +```text +docfill: [CONFIG_READ] read config: open manual_tests/not-exist.json: no such file or directory +hint: Check that the config file exists and is readable. +context: config=manual_tests/not-exist.json +``` + +筛选无匹配示例: + +```bash +dist/docfill-darwin-arm64 run -c manual_tests/04_filter_work_order_to_word/task.json --var date=2026-06-18 --var ticket_no=GD-999 --verbose +``` + +输出示例: + +```text +log: load config path=manual_tests/04_filter_work_order_to_word/task.json +log: read data type=excel path=/Users/zhaoyilun/Documents/xls_doc/manual_tests/04_filter_work_order_to_word/source_work_orders.xlsx +log: read data type=excel path=/Users/zhaoyilun/Documents/xls_doc/manual_tests/04_filter_work_order_to_word/source_work_orders.xlsx rows=3 +docfill: [DATA_FILTER_NO_MATCH] filter matched no rows +hint: Check filter.equals, --var values, or source table contents. +context: expect=one filter=工单编号=GD-999,日期=2026-06-18 +``` + +错误码说明: + +| 错误码 | 含义 | 常见处理方式 | +| --- | --- | --- | +| `CLI_USAGE` | 命令行参数错误 | 检查命令、`-c`、`--var key=value`。 | +| `CONFIG_READ` | 配置文件读取失败 | 检查路径、文件是否存在、读权限。 | +| `CONFIG_PARSE` | 配置 JSON 解析失败 | 检查 JSON 语法。 | +| `CONFIG_VALIDATE` | 配置字段缺失或不支持 | 检查 `data.type`、`data.path`、`template.path`、`output.path`、`filter.expect`。 | +| `DATA_EXCEL` | Excel 数据读取失败 | 检查 `.xlsx` 文件、工作表名、表头行。 | +| `DATA_SQLITE` | SQLite 数据读取或查询失败 | 检查 `.db` 文件、SQL、参数。 | +| `DATA_EMPTY` | 数据源没有返回可生成的数据行 | 检查源数据是否为空。 | +| `DATA_FILTER_FIELD` | 筛选字段不在数据中 | 检查 Excel 表头或 SQLite 查询列名。 | +| `DATA_FILTER_VALUE` | 筛选条件引用的变量没有提供 | 补充 `--var` 或 `vars`。 | +| `DATA_FILTER_NO_MATCH` | 筛选后没有符合条件的数据行 | 检查筛选条件,或整理源表。 | +| `DATA_FILTER_MULTI_MATCH` | 期望一行但匹配多行 | 增加筛选条件,或整理重复数据。 | +| `TEMPLATE_OPEN` | 模板读取失败 | 检查模板路径和文件格式。 | +| `TEMPLATE_FIELD_MISSING` | 模板字段缺失 | 在数据源、`vars` 或 `--var` 中补充字段。 | +| `TEMPLATE_UNRESOLVED` | 渲染后仍残留占位符 | 检查模板占位符拼写和字段值。 | +| `OUTPUT_EXISTS` | 输出文件已存在 | 修改输出路径或设置 `output.overwrite: true`。 | +| `OUTPUT_WRITE` | 输出写入失败 | 检查输出目录权限、文件占用状态。 | +| `INTERNAL` | 未分类内部错误 | 保留 stderr 和输入文件,开启 `--verbose` 复现。 | + +### 12. 自动化调用示例 + +以下示例展示数字员工或调度脚本如何调用 `docfill`。该脚本只做最小封装,不承担模板解析或业务逻辑。 + +```bash +#!/usr/bin/env bash +set -euo pipefail + +DOCFILL="/Users/zhaoyilun/Documents/xls_doc/dist/docfill-darwin-arm64" +CONFIG="/Users/zhaoyilun/Documents/xls_doc/manual_tests/04_filter_work_order_to_word/task.json" +DATE="${1:?date is required, example: 2026-06-18}" +TICKET_NO="${2:?ticket_no is required, example: GD-002}" + +"$DOCFILL" run -c "$CONFIG" --var date="$DATE" --var ticket_no="$TICKET_NO" --verbose +``` + +执行: + +```bash +bash run-docfill.sh 2026-06-18 GD-002 +``` + +预期结果: + +```text +generated 1 file(s) +- /Users/zhaoyilun/Documents/xls_doc/manual_tests/04_filter_work_order_to_word/out/work_order_2026-06-18_GD-002.docx +``` + +集成建议: + +- 把业务系统接口采集结果先落成 Excel 或 SQLite。 +- 为每类报表维护一个 `task.json`。 +- 数字员工只负责准备运行变量并执行命令。 +- 复杂筛选优先通过整理 Excel 表解决,例如新增辅助列。 +- 不要把账号密码、审批状态、业务系统访问逻辑写入 `docfill` 配置。 + +### 13. 开发与验证 + +运行全部 Go 测试: + +```bash +go test -count=1 ./... +``` + +运行冒烟测试: + +```bash +bash scripts/smoke.sh +``` + +构建发布用本机二进制: + +```bash +bash scripts/build.sh +``` + +重新生成手工测试素材: + +```bash +/Users/zhaoyilun/.cache/codex-runtimes/codex-primary-runtime/dependencies/python/bin/python3 scripts/make-manual-test-materials.py +``` + +冒烟测试覆盖内容: + +- Go 单元测试。 +- 临时构建 `docfill`。 +- 生成临时 Excel、Word、SQLite 示例数据。 +- 执行无筛选 Excel 到 Word 示例。 +- 执行筛选 Excel 到 Word 示例。 +- 执行 SQLite 到 Excel 示例。 +- 检查输出文件是否生成。 + +### 14. 当前边界 + +为了保持工具小型、稳定、便于自动化调用,当前明确不包含以下能力: + +- 不提供 Web 界面。 +- 不提供模板设计器。 +- 不直接登录业务系统。 +- 不管理账号、密码或权限。 +- 不实现审批流。 +- 不实现 Word 表格循环或条件语法。 +- 不实现 Excel 公式重算和透视表刷新。 +- 不实现复杂筛选语法。 +- 不实现复杂任务编排。 + +如需扩展,应优先通过外部脚本准备数据,再交给 `docfill` 执行单次文档填充。 diff --git a/README.md b/README.md index 3458507..f5572e7 100644 --- a/README.md +++ b/README.md @@ -1,79 +1,151 @@ # docfill -`docfill` 是一个最小化本地填报工具:从 Excel 或 SQLite 读取数据,把 `{{字段名}}` 填入 Word/Excel 模板,生成输出文件。 +`docfill` 是一个本地文档填充命令行工具。它从 Excel 或 SQLite 读取结构化数据,按业务条件筛选出需要使用的数据行,再把数据填入 Word 或 Excel 模板中的 `{{字段名}}` 占位符。 -## Build +本工具的定位是“小型、稳定、便于数字员工调用”。它只负责本地数据到本地模板的填充,不内置业务系统登录、审批流、Web 界面、模板设计器或权限系统。 + +## 核心理解 + +`task.json` 是某一种业务报表的固定任务说明书,命令行 `--var` 是本次运行传入的具体条件。 + +```text +不同业务 = 不同 task.json +本次运行的日期、工单编号、人员、批次 = --var +真实数据 = Excel 或 SQLite +模板文件 = Word 或 Excel +``` + +优先级: + +```text +数据表里的字段 > 命令行 --var > task.json 里的 vars +``` + +例如 `task.json` 中写了: + +```json +"vars": { + "date": "2026-06-18" +} +``` + +运行时执行: + +```bash +dist/docfill-darwin-arm64 run -c task.json --var date=2026-06-19 --var ticket_no=GD-001 +``` + +实际使用的是: + +```text +date = 2026-06-19 +ticket_no = GD-001 +``` + +也就是 `--var date=2026-06-19` 会覆盖 `task.json` 里的默认 `date=2026-06-18`。 + +## 最小实践 + +进入仓库目录: + +```bash +cd /Users/zhaoyilun/Documents/xls_doc +``` + +构建本机二进制: ```bash -go build -o docfill ./cmd/docfill bash scripts/build.sh ``` -`scripts/build.sh` writes the local macOS arm64 binary to `dist/docfill-darwin-arm64`. - -## Run - -```bash -./docfill run --config task.json -./docfill run -c task.json --var date=2026-06-18 --var batch=早班 -``` - -成功时 stdout 输出生成文件清单: +输出示例: ```text -generated 2 file(s) -- /path/to/out/report_张三.xlsx -- /path/to/out/report_李四.xlsx +/Users/zhaoyilun/Documents/xls_doc/dist/docfill-darwin-arm64 ``` -退出码: - -- `0`: 成功。 -- `1`: 配置、数据、模板或输出失败。 -- `2`: 命令行参数错误。 - -## Run Case Tests +运行“按日期 + 工单编号筛选一条工单并生成 Word”的测试任务: ```bash -go test -run TestCase -v ./internal/docfill +dist/docfill-darwin-arm64 run -c manual_tests/04_filter_work_order_to_word/task.json --var date=2026-06-18 --var ticket_no=GD-002 --verbose ``` -当前案例覆盖: +输出示例: -- Excel 日报数据填 Excel 模板,批量生成个人日报。 -- SQLite 日报数据填 Word 模板,批量生成个人日报。 -- SQLite 汇总数据填 Excel 模板,批量生成部门汇总表。 +```text +log: load config path=manual_tests/04_filter_work_order_to_word/task.json +log: read data type=excel path=/Users/zhaoyilun/Documents/xls_doc/manual_tests/04_filter_work_order_to_word/source_work_orders.xlsx +log: read data type=excel path=/Users/zhaoyilun/Documents/xls_doc/manual_tests/04_filter_work_order_to_word/source_work_orders.xlsx rows=3 +log: filter rows=3 matched=1 expect=one +log: render row=1 output=/Users/zhaoyilun/Documents/xls_doc/manual_tests/04_filter_work_order_to_word/out/work_order_2026-06-18_GD-002.docx +generated 1 file(s) +- /Users/zhaoyilun/Documents/xls_doc/manual_tests/04_filter_work_order_to_word/out/work_order_2026-06-18_GD-002.docx +``` -## Smoke Test +查看生成结果: + +```bash +open manual_tests/04_filter_work_order_to_word/out +``` + +更多可运行案例见 [HOWTO.md](HOWTO.md) 和 [manual_tests/README.md](manual_tests/README.md)。 + +## 常用命令 + +构建: + +```bash +bash scripts/build.sh +``` + +运行一个任务: + +```bash +dist/docfill-darwin-arm64 run -c task.json +``` + +运行任务并传入本次筛选条件: + +```bash +dist/docfill-darwin-arm64 run -c 工单日报.json --var date=2026-06-18 --var ticket_no=GD-002 +``` + +输出诊断日志: + +```bash +dist/docfill-darwin-arm64 run -c task.json --verbose +``` + +重新生成本地测试素材: + +```bash +/Users/zhaoyilun/.cache/codex-runtimes/codex-primary-runtime/dependencies/python/bin/python3 scripts/make-manual-test-materials.py +``` + +运行自动化冒烟测试: ```bash bash scripts/smoke.sh ``` -Smoke test 会: +运行 Go 测试: -- 跑全量 Go 测试。 -- 构建临时 `docfill` 二进制。 -- 复制 `examples/` 到临时目录。 -- 生成临时 Excel、Word、SQLite 示例数据。 -- 执行两个示例任务并检查输出文件。 +```bash +go test -count=1 ./... +``` -## Digital Employee Runbook +## 筛选配置示例 -给数字员工或调度脚本使用时,看: +Excel 工单表: -- `docs/digital-employee-runbook.md` +```text +日期 工单编号 客户名称 系统来源 处理结果 下一步 +2026-06-18 GD-001 A 公司 PMS3.0 已派单 等待现场反馈 +2026-06-18 GD-002 B 公司 D5000 已完成 归档并同步日报 +2026-06-19 GD-001 C 公司 风控平台 待复核 补充截图 +``` -## Runnable Examples - -示例配置在 `examples/`: - -- `examples/excel-to-word/task.json` -- `examples/sqlite-to-excel/task.json` - -示例里的二进制 Office/SQLite 文件由 `scripts/smoke-fixtures` 临时生成,不提交到仓库。 - -## Excel Data Example +`task.json`: ```json { @@ -82,63 +154,88 @@ Smoke test 会: }, "data": { "type": "excel", - "path": "./data.xlsx", - "sheet": "Sheet1", + "path": "./source_work_orders.xlsx", + "sheet": "工单", "header_row": 1 }, + "filter": { + "equals": { + "日期": "{{date}}", + "工单编号": "{{ticket_no}}" + }, + "expect": "one" + }, "template": { - "path": "./template.docx" + "path": "./work_order_template.docx" }, "output": { - "path": "./out/report_{{date}}_{{name}}_{{_row}}.docx", - "overwrite": false + "path": "./out/work_order_{{日期}}_{{工单编号}}.docx", + "overwrite": true } } ``` -Excel 第一行是字段名,后续每一行生成一个文件。 +运行: -## SQLite Data Example - -```json -{ - "vars": { - "date": "2026-06-18" - }, - "data": { - "type": "sqlite", - "path": "./data.db", - "query": "select name, date, done from daily_report where date = ?", - "params": ["{{date}}"] - }, - "template": { - "path": "./template.xlsx" - }, - "output": { - "path": "./out/report_{{name}}_{{_row}}.xlsx" - } -} +```bash +dist/docfill-darwin-arm64 run -c task.json --var date=2026-06-18 --var ticket_no=GD-002 ``` -SQL 查询结果的列名就是模板占位符字段名。 +筛选含义: -## P0 Rules +```text +找到 日期 = 2026-06-18,并且 工单编号 = GD-002 的那一行。 +``` -- 配置里的相对路径按 `task.json` 所在目录解析。 -- `vars` 可以提供默认变量,命令行 `--var key=value` 会覆盖同名默认变量。 -- 模板填充时,每行数据字段优先于 `vars`。 -- `_row` 是内置变量,表示当前数据行序号,从 `1` 开始。 -- SQLite `params` 对应 SQL 里的 `?` 参数。 -- Excel `header_row` 从 `1` 开始,默认是 `1`。 -- 默认不覆盖已有输出文件;只有 `output.overwrite: true` 才允许覆盖。 -- 输出文件路径中的字段值会清理 `/ \ : * ? " < > |`。 -- 模板里缺字段或渲染后仍有 `{{字段}}`,会直接失败。 -- Word 模板支持同一段落内被拆开的文本占位符,例如 `{{na` 和 `me}}` 位于相邻文本节点。 +`filter.expect` 支持: -## MVP Limits +- `one`: 必须只匹配一行,适合工单、单份日报、单个报表。 +- `many`: 允许匹配多行,适合按日期生成多个人或多个部门的报表。 -- 只支持 JSON 配置。 -- 只支持 `.xlsx` 数据源、SQLite 数据源。 -- 只支持 `.docx` 和 `.xlsx` 模板。 -- Word 占位符拆分只做最小兼容:支持同一段落内的文本节点拆分,不做复杂表格循环或样式级模板语法。 -- 不做 Web、权限、审批流、模板设计器或业务系统直连。 +未配置 `filter` 时,工具沿用旧行为:读取到的每一行都会生成一个输出文件。 + +## 核心规则 + +- 配置文件使用 JSON。 +- 数据源支持 `.xlsx` 和 SQLite `.db`。 +- 模板与输出支持 `.docx` 和 `.xlsx`。 +- 模板占位符格式为 `{{字段名}}`。 +- Excel 数据的表头行提供字段名,SQLite 查询结果的列名提供字段名。 +- 常用场景是通过 `filter.equals` 先筛选数据,再填充模板。 +- 多个筛选条件之间是“全部满足”关系。 +- 筛选只支持等值匹配,不支持模糊匹配、范围查询、OR 或复杂表达式。 +- 复杂情况建议业务人员整理 Excel,例如新增“填报批次”“业务唯一标识”等辅助列。 +- `vars` 提供默认变量,命令行 `--var key=value` 可以覆盖同名变量。 +- 数据行字段优先于 `vars` 和 `--var`。 +- `_row` 是内置变量,表示当前输出对应的结果行序号,从 `1` 开始。 +- 默认不覆盖已存在文件,只有 `output.overwrite: true` 才允许覆盖。 +- 成功结果写入 stdout,诊断日志和错误写入 stderr,便于数字员工或调度脚本判断执行结果。 + +## 退出码 + +- `0`: 执行成功。 +- `1`: 配置、数据、模板或输出处理失败。 +- `2`: 命令行参数错误。 + +错误输出格式: + +```text +docfill: [ERROR_CODE] message +hint: repair suggestion +context: key=value +``` + +常见筛选错误: + +- `DATA_FILTER_FIELD`: 筛选字段不在数据表中。 +- `DATA_FILTER_VALUE`: 筛选条件引用的变量没有提供。 +- `DATA_FILTER_NO_MATCH`: 没有找到符合条件的数据行。 +- `DATA_FILTER_MULTI_MATCH`: 期望匹配一行,但实际匹配多行。 + +完整错误码、日志说明和集成建议见 [HOWTO.md](HOWTO.md)。 + +## 文档索引 + +- [HOWTO.md](HOWTO.md): 完整使用说明,包含最小实践、详细配置、输入输出示例、错误处理和数字员工调用建议。 +- [manual_tests/README.md](manual_tests/README.md): 本地真实测试素材说明。 +- [docs/digital-employee-runbook.md](docs/digital-employee-runbook.md): 面向数字员工或调度脚本的最小运行约定。 diff --git a/cmd/docfill/main.go b/cmd/docfill/main.go index bf46060..7fff71b 100644 --- a/cmd/docfill/main.go +++ b/cmd/docfill/main.go @@ -1,10 +1,12 @@ package main import ( + "errors" "flag" "fmt" "io" "os" + "sort" "strings" "xlsdoc/internal/docfill" @@ -18,11 +20,11 @@ func main() { func run(args []string, stdout, stderr io.Writer) int { if len(args) == 0 { - fmt.Fprintln(stderr, "docfill: missing command: run") + writeCodedError(stderr, docfill.CodeCLIUsage, "missing command: run", "Use: docfill run -c task.json", nil) return 2 } if args[0] != "run" { - fmt.Fprintf(stderr, "docfill: unknown command: %s\n", args[0]) + writeCodedError(stderr, docfill.CodeCLIUsage, "unknown command: "+args[0], "Use: docfill run -c task.json", nil) return 2 } @@ -43,38 +45,78 @@ func runFill(args []string, stderr io.Writer) (docfill.RunResult, int) { fs.SetOutput(stderr) var configPath string + var verbose bool var vars varFlags = make(map[string]string) fs.SetOutput(io.Discard) fs.StringVar(&configPath, "config", "", "path to task json") fs.StringVar(&configPath, "c", "", "path to task json") + fs.BoolVar(&verbose, "verbose", false, "print diagnostic logs to stderr") fs.Var(vars, "var", "template variable as key=value; repeatable") if err := fs.Parse(args); err != nil { - fmt.Fprintf(stderr, "docfill: %v\n", err) + writeCodedError(stderr, docfill.CodeCLIUsage, err.Error(), "Check command flags and use key=value for --var.", nil) return docfill.RunResult{}, 2 } if fs.NArg() > 0 { - fmt.Fprintf(stderr, "docfill: unexpected argument: %s\n", fs.Arg(0)) + writeCodedError(stderr, docfill.CodeCLIUsage, "unexpected argument: "+fs.Arg(0), "Remove extra positional arguments.", nil) return docfill.RunResult{}, 2 } if vars == nil { vars = make(map[string]string) } if configPath == "" { - fmt.Fprintln(stderr, "docfill: missing --config") + writeCodedError(stderr, docfill.CodeCLIUsage, "missing --config", "Use -c task.json or --config task.json.", nil) fs.SetOutput(stderr) fs.Usage() return docfill.RunResult{}, 2 } - result, err := docfill.RunWithOptions(configPath, docfill.RunOptions{Vars: vars}) + var logf func(format string, args ...any) + if verbose { + logf = func(format string, args ...any) { + fmt.Fprintf(stderr, "log: "+format+"\n", args...) + } + } + + result, err := docfill.RunWithOptions(configPath, docfill.RunOptions{Vars: vars, Logf: logf}) if err != nil { - fmt.Fprintf(stderr, "docfill: %v\n", err) + writeExecutionError(stderr, err) return docfill.RunResult{}, 1 } return result, 0 } +func writeExecutionError(stderr io.Writer, err error) { + var appErr *docfill.AppError + if errors.As(err, &appErr) { + writeCodedError(stderr, appErr.Code, err.Error(), appErr.Hint, appErr.Context) + return + } + writeCodedError(stderr, docfill.CodeInternal, err.Error(), "Run with --verbose and inspect inputs if this repeats.", nil) +} + +func writeCodedError(stderr io.Writer, code docfill.ErrorCode, message, hint string, context map[string]string) { + fmt.Fprintf(stderr, "docfill: [%s] %s\n", code, message) + if hint != "" { + fmt.Fprintf(stderr, "hint: %s\n", hint) + } + if len(context) == 0 { + return + } + + keys := make([]string, 0, len(context)) + for key := range context { + keys = append(keys, key) + } + sort.Strings(keys) + + parts := make([]string, 0, len(keys)) + for _, key := range keys { + parts = append(parts, key+"="+context[key]) + } + fmt.Fprintf(stderr, "context: %s\n", strings.Join(parts, " ")) +} + func (v varFlags) String() string { if len(v) == 0 { return "" diff --git a/cmd/docfill/main_test.go b/cmd/docfill/main_test.go index bc7ca9d..24de209 100644 --- a/cmd/docfill/main_test.go +++ b/cmd/docfill/main_test.go @@ -63,7 +63,7 @@ func TestRunCommandRejectsBadVarSyntax(t *testing.T) { if exitCode != 2 { t.Fatalf("exit code = %d, want 2", exitCode) } - if !strings.Contains(stderr.String(), "docfill:") || !strings.Contains(stderr.String(), "invalid --var") { + if !strings.Contains(stderr.String(), "[CLI_USAGE]") || !strings.Contains(stderr.String(), "invalid --var") { t.Fatalf("unexpected stderr: %q", stderr.String()) } } @@ -84,6 +84,96 @@ func TestRunCommandRejectsUnexpectedArgs(t *testing.T) { } } +func TestRunCommandFormatsCodedExecutionErrors(t *testing.T) { + dir := t.TempDir() + dataPath := filepath.Join(dir, "data.xlsx") + templatePath := filepath.Join(dir, "template.xlsx") + configPath := filepath.Join(dir, "task.json") + + writeCLIWorkbook(t, dataPath, "Daily", [][]string{ + {"name"}, + {"张三"}, + }) + writeCLIWorkbook(t, templatePath, "日报", [][]string{ + {"{{name}}", "{{missing}}"}, + }) + writeCLIJSON(t, configPath, map[string]any{ + "data": map[string]any{ + "type": "excel", + "path": dataPath, + "sheet": "Daily", + }, + "template": map[string]any{ + "path": templatePath, + }, + "output": map[string]any{ + "path": filepath.Join(dir, "out", "日报_{{name}}.xlsx"), + }, + }) + + var stdout bytes.Buffer + var stderr bytes.Buffer + exitCode := run([]string{"run", "-c", configPath}, &stdout, &stderr) + + if exitCode != 1 { + t.Fatalf("exit code = %d, want 1", exitCode) + } + if stdout.Len() != 0 { + t.Fatalf("expected empty stdout, got %q", stdout.String()) + } + got := stderr.String() + for _, want := range []string{"docfill: [TEMPLATE_FIELD_MISSING]", "hint:", "context:", "field=missing", "template="} { + if !strings.Contains(got, want) { + t.Fatalf("stderr missing %q: %q", want, got) + } + } +} + +func TestRunCommandVerbosePrintsStepLogs(t *testing.T) { + dir := t.TempDir() + dataPath := filepath.Join(dir, "data.xlsx") + templatePath := filepath.Join(dir, "template.xlsx") + configPath := filepath.Join(dir, "task.json") + + writeCLIWorkbook(t, dataPath, "Daily", [][]string{ + {"name", "done"}, + {"张三", "完成日报"}, + }) + writeCLIWorkbook(t, templatePath, "日报", [][]string{ + {"{{name}}", "{{done}}"}, + }) + writeCLIJSON(t, configPath, map[string]any{ + "data": map[string]any{ + "type": "excel", + "path": dataPath, + "sheet": "Daily", + }, + "template": map[string]any{ + "path": templatePath, + }, + "output": map[string]any{ + "path": filepath.Join(dir, "out", "日报_{{name}}.xlsx"), + }, + }) + + var stdout bytes.Buffer + var stderr bytes.Buffer + exitCode := run([]string{"run", "-c", configPath, "--verbose"}, &stdout, &stderr) + + if exitCode != 0 { + t.Fatalf("exit code = %d, stderr=%q", exitCode, stderr.String()) + } + if !strings.Contains(stdout.String(), "generated 1 file(s)") { + t.Fatalf("unexpected stdout: %q", stdout.String()) + } + got := stderr.String() + for _, want := range []string{"log: load config", "log: read data", "log: render row=1"} { + if !strings.Contains(got, want) { + t.Fatalf("stderr missing %q: %q", want, got) + } + } +} + func writeCLIWorkbook(t *testing.T, path, sheet string, rows [][]string) { t.Helper() diff --git a/docs/digital-employee-runbook.md b/docs/digital-employee-runbook.md index 70fa061..b15e1ab 100644 --- a/docs/digital-employee-runbook.md +++ b/docs/digital-employee-runbook.md @@ -8,11 +8,14 @@ Each run needs: - A `task.json` config file. - A data source: `.xlsx` or SQLite `.db`. +- Optional business filters in `filter.equals`. - A template: `.docx` or `.xlsx`. - An output path pattern in `task.json`. Paths inside `task.json` are resolved from the config file directory. +Use one `task.json` per business task. Use `--var` for values that change per run, such as date, ticket number, person, or batch. + ## Command ```bash @@ -22,10 +25,42 @@ docfill run -c /path/to/task.json --var date=2026-06-18 Use repeated `--var key=value` arguments for runtime values: ```bash -docfill run -c task.json --var date=2026-06-18 --var batch=早班 +docfill run -c task.json --var date=2026-06-18 --var ticket_no=GD-002 ``` -CLI variables override `vars` in `task.json`. Row data overrides both. +Priority: + +```text +row data > CLI --var > task.json vars +``` + +CLI variables override `vars` in `task.json`. The selected row data overrides both when rendering templates and output paths. + +If `task.json` has a filter: + +```json +"filter": { + "equals": { + "日期": "{{date}}", + "工单编号": "{{ticket_no}}" + }, + "expect": "one" +} +``` + +then the command: + +```bash +docfill run -c task.json --var date=2026-06-18 --var ticket_no=GD-002 +``` + +selects the row where `日期 = 2026-06-18` and `工单编号 = GD-002`. + +Use `--verbose` only when diagnosing a failed or suspicious run: + +```bash +docfill run -c task.json --var date=2026-06-18 --var ticket_no=GD-002 --verbose +``` ## Success @@ -48,9 +83,91 @@ Exit code `2` means the command line was invalid. Errors are written to stderr with the `docfill:` prefix: ```text -docfill: render row 1: missing template field "done" +docfill: [TEMPLATE_FIELD_MISSING] render row 1: missing template field "done" +hint: Add column "done" to the data source or pass --var done=... +context: field=done template=/path/template.docx ``` +Verbose logs are also written to stderr: + +```text +log: load config path=/path/task.json +log: read data type=excel path=/path/data.xlsx +log: read data type=excel path=/path/data.xlsx rows=3 +log: filter rows=3 matched=1 expect=one +log: render row=1 output=/path/out/work_order_2026-06-18_GD-002.docx +``` + +## Error Codes + +`CLI_USAGE` + +The command line is invalid. + +`CONFIG_READ` + +The config file cannot be read. + +`CONFIG_PARSE` + +The config file is not valid JSON. + +`CONFIG_VALIDATE` + +The config is missing required fields or uses unsupported values. + +`DATA_EXCEL` + +Excel data cannot be opened or read. + +`DATA_SQLITE` + +SQLite data cannot be opened, queried, or parameterized. + +`DATA_EMPTY` + +The data source returned no rows. + +`DATA_FILTER_FIELD` + +The filter references a field that is not in the data. + +`DATA_FILTER_VALUE` + +The filter references a variable that was not provided. + +`DATA_FILTER_NO_MATCH` + +The filter matched no rows. + +`DATA_FILTER_MULTI_MATCH` + +The filter expected one row but matched multiple rows. + +`TEMPLATE_OPEN` + +The template file cannot be opened or inspected. + +`TEMPLATE_FIELD_MISSING` + +The template references a field that is not available. + +`TEMPLATE_UNRESOLVED` + +The rendered file would still contain a `{{field}}` placeholder. + +`OUTPUT_EXISTS` + +The output file exists and overwrite is not enabled. + +`OUTPUT_WRITE` + +The output directory or file cannot be written. + +`INTERNAL` + +An unexpected unclassified error occurred. + ## Common Errors `missing template field` @@ -65,6 +182,18 @@ The output file exists and `output.overwrite` is not `true`. A SQLite query parameter such as `{{date}}` was not provided. +`filter matched no rows` + +Check `filter.equals`, `--var` values, or the source table contents. + +`filter matched N rows but expected one` + +Add another filter condition or clean duplicate rows in the source table. + +`filter field is not in data` + +Check Excel headers or SQLite query column names. + `unresolved placeholder` The rendered document still contains `{{field}}`. Check the source data value and the template. @@ -87,4 +216,4 @@ dist/docfill-darwin-arm64 bash scripts/smoke.sh ``` -Smoke test builds a temporary binary, generates temporary example files, runs both example configs, and checks generated outputs. +Smoke test builds a temporary binary, generates temporary example files, runs example configs including the filter case, and checks generated outputs. diff --git a/docs/evaluations/2026-06-19-full-evaluation.md b/docs/evaluations/2026-06-19-full-evaluation.md new file mode 100644 index 0000000..1de2b43 --- /dev/null +++ b/docs/evaluations/2026-06-19-full-evaluation.md @@ -0,0 +1,186 @@ +# docfill 全方位评测报告 + +评测日期:2026-06-19 + +评测对象:`docfill` 当前工作区版本,包含错误码、日志、业务筛选 `filter.equals`、手工测试素材和用户文档更新。 + +## 结论 + +本轮评测结论:通过当前 MVP 质量门槛。 + +适用范围: + +- 本地 macOS arm64 构建。 +- Excel / SQLite 数据源读取。 +- Word / Excel 模板填充。 +- `filter.equals` 多条件等值筛选。 +- `filter.expect` 的 `one` / `many` 行数约束。 +- CLI 成功输出、错误码、提示和上下文。 +- 用户文档、示例配置和手工测试素材一致性。 + +未宣称覆盖: + +- Windows / Linux 二进制构建。 +- 大体量数据性能测试。 +- Excel 公式重算、透视表刷新。 +- 复杂 Word 模板语法。 +- 业务系统直连、权限、审批或调度系统。 + +## 工作区状态 + +当前工作区包含未提交变更,评测没有执行提交、回滚或清理。 + +基线提交: + +```text +ca444bd feat: add docfill mvp cli +``` + +评测时存在的主要变更类型: + +- CLI 错误码和日志。 +- `filter.equals` / `filter.expect` 筛选能力。 +- 新增 `HOWTO.md`。 +- 新增 `manual_tests/` 真实测试素材。 +- 新增 `examples/excel-filter-to-word/` smoke 示例。 +- 更新 README、runbook 和示例文档。 + +## 自动化评测 + +| 项目 | 命令 | 结果 | +| --- | --- | --- | +| Git diff 格式检查 | `git diff --check` | 通过,无输出 | +| Go 单元测试 | `go test -count=1 ./...` | 通过 | +| Go race 测试 | `go test -race -count=1 ./...` | 通过 | +| Go 静态检查 | `go vet ./...` | 通过,无输出 | +| 本机构建 | `bash scripts/build.sh` | 通过,输出 `dist/docfill-darwin-arm64` | +| 冒烟测试 | `bash scripts/smoke.sh` | 通过,包含无筛选、筛选、SQLite 示例 | + +`bash scripts/smoke.sh` 覆盖: + +- Excel 到 Word:生成 2 个日报 Word 文件。 +- Excel 筛选到 Word:按 `date + ticket_no` 生成 1 个工单 Word 文件。 +- SQLite 到 Excel:生成 2 个部门汇总 Excel 文件。 + +## 真实素材成功路径 + +| 案例 | 命令 | 结果 | +| --- | --- | --- | +| Excel 筛选到 Word | `dist/docfill-darwin-arm64 run -c manual_tests/04_filter_work_order_to_word/task.json --var date=2026-06-18 --var ticket_no=GD-002 --verbose` | 生成 1 个 Word 文件 | +| Excel 到 Word | `dist/docfill-darwin-arm64 run -c manual_tests/01_excel_to_word/task.json --var batch=早班 --verbose` | 生成 2 个 Word 文件 | +| SQLite 到 Excel | `dist/docfill-darwin-arm64 run -c manual_tests/02_sqlite_to_excel/task.json --var date=2026-06-18 --verbose` | 生成 2 个 Excel 文件 | +| Excel 到 Excel | `dist/docfill-darwin-arm64 run -c manual_tests/03_excel_to_excel/task.json --var date=2026-06-18 --verbose` | 生成 2 个 Excel 文件 | + +关键输出: + +```text +manual_tests/04_filter_work_order_to_word/out/work_order_2026-06-18_GD-002.docx +manual_tests/01_excel_to_word/out/daily_2026-06-18_张三_测试_1.docx +manual_tests/01_excel_to_word/out/daily_2026-06-18_李四_2.docx +manual_tests/02_sqlite_to_excel/out/summary_客服部_1.xlsx +manual_tests/02_sqlite_to_excel/out/summary_营销部_2.xlsx +manual_tests/03_excel_to_excel/out/audit_2026-06-18_王五_1.xlsx +manual_tests/03_excel_to_excel/out/audit_2026-06-18_赵六_2.xlsx +``` + +## 真实素材内容核验 + +使用 bundled Python 读取生成的 Word / Excel 文件并断言关键字段。 + +核验结果: + +- 筛选工单 Word 包含 `GD-002`、`B 公司`、`D5000`、`已完成`。 +- 筛选工单 Word 不包含非目标行 `GD-001`、`A 公司`。 +- 日报 Word 包含 `张三/测试`、`早班`、`营销部`。 +- SQLite 汇总 Excel 中 `summary_营销部_2.xlsx` 的 B2:B6 为 `营销部 / 2026-06-18 / 张三 / 128 / 3`。 +- Excel 质检输出中 `audit_2026-06-18_赵六_2.xlsx` 的 B2:B6 为 `2026-06-18 / 赵六 / 系统截图一致性 / 87 / 缺少 1 张截图,需要补充`。 +- SQLite 源表包含 3 行测试数据。 + +## DOCX 渲染核验 + +使用 `documents` skill 的 `render_docx.py` 渲染两个 Word 输出: + +```text +manual_tests/_evaluation_rendered/filter/page-1.png +manual_tests/_evaluation_rendered/daily/page-1.png +``` + +视觉核验结果: + +- 筛选工单页可读,字段位置正常,关键值为 `2026-06-18 / GD-002 / B 公司 / D5000 / 已完成 / 归档并同步日报`。 +- 日报页可读,字段位置正常,关键值为 `张三/测试 / 营销部 / 早班`。 +- 未观察到明显空白页、文本重叠、缺字或表格错位。 + +## CLI 失败路径 + +| 场景 | 命令或配置 | 预期错误码 | 结果 | +| --- | --- | --- | --- | +| 筛选无匹配 | `ticket_no=GD-999` | `DATA_FILTER_NO_MATCH` | 通过 | +| 筛选变量缺失 | 不传 `ticket_no` | `DATA_FILTER_VALUE` | 通过 | +| 筛选匹配多行 | 临时配置只按 `日期` 筛选且 `expect=one` | `DATA_FILTER_MULTI_MATCH` | 通过 | +| 非法 `filter.expect` | 临时配置 `expect=single` | `CONFIG_VALIDATE` | 通过 | +| 配置不存在 | `-c manual_tests/not-exist.json` | `CONFIG_READ` | 通过 | +| CLI 参数错误 | `--var date` | `CLI_USAGE`,退出码 2 | 通过 | + +典型错误输出: + +```text +docfill: [DATA_FILTER_NO_MATCH] filter matched no rows +hint: Check filter.equals, --var values, or source table contents. +context: expect=one filter=工单编号=GD-999,日期=2026-06-18 +``` + +```text +docfill: [DATA_FILTER_MULTI_MATCH] filter matched 2 rows but expected one +hint: Add another filter condition or clean duplicate rows in the source table. +context: filter=日期=2026-06-18 matches=2 +``` + +## 结构与文档一致性 + +| 检查 | 结果 | +| --- | --- | +| 所有 `task.json` 可被 JSON 解析 | 通过 | +| `manual_tests/**/out/*.{docx,xlsx}` 内部 XML 无残留 `{{` / `}}` 占位符 | 通过 | +| README / HOWTO / runbook 均说明 `filter.equals`、`filter.expect`、`--var` 优先级 | 通过 | +| 用户文档未出现不合适措辞 `小白`、`大白话` | 通过 | +| 用户文档无 `TODO` / `TBD` / `FIXME` | 通过 | + +## 能力覆盖评估 + +已验证: + +- Excel 数据源读取。 +- SQLite 数据源读取。 +- Word 模板填充。 +- Excel 模板填充。 +- Word 同段落拆分占位符替换。 +- 输出文件名非法字符清理。 +- `vars` 默认变量。 +- CLI `--var` 覆盖 `vars`。 +- 数据行字段优先于 `--var` / `vars`。 +- 多条件业务筛选。 +- `expect=one` 和 `expect=many`。 +- 筛选错误、配置错误、CLI 错误。 +- stdout 输出生成文件清单。 +- stderr 输出日志、错误码、hint、context。 + +未覆盖或仅部分覆盖: + +- 大文件性能。 +- 多 sheet 大范围模板扫描性能。 +- Windows / Linux 路径与构建。 +- Excel 公式、图表、透视表类模板。 +- Word 跨段落拆分占位符。 +- 真实业务系统导出的复杂脏数据。 + +## 风险与建议 + +P0 无阻塞问题。 + +建议进入下一轮前只做小范围补强: + +1. 增加一条大约 500 到 1000 行 Excel 的筛选性能测试,确认小工具在常见业务表规模下响应稳定。 +2. 增加文档中的“字段命名建议”,例如日期列、工单编号列、辅助列的命名方式。 +3. 保持筛选语法只支持等值 AND,不增加模糊匹配、范围查询或表达式。 +4. 发布前在目标机器上补一次 `bash scripts/build.sh && bash scripts/smoke.sh`。 diff --git a/docs/superpowers/plans/2026-06-18-docfill-p0.7-errors-logs.md b/docs/superpowers/plans/2026-06-18-docfill-p0.7-errors-logs.md new file mode 100644 index 0000000..21780b6 --- /dev/null +++ b/docs/superpowers/plans/2026-06-18-docfill-p0.7-errors-logs.md @@ -0,0 +1,52 @@ +# Docfill P0.7 Errors And Logs Implementation Plan + +> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. + +**Goal:** Make failures easier for digital employees and humans to classify without turning `docfill` into a logging platform. + +**Architecture:** Add a small `AppError` type in the internal package with code, hint, and context. Keep CLI formatting in `cmd/docfill`; add only one runtime logging switch, `--verbose`, which writes step logs to stderr. + +**Tech Stack:** Go standard errors, existing CLI flag parsing, existing tests. + +--- + +### Task 1: Error Contract + +**Files:** +- Create: `internal/docfill/errors.go` +- Modify: `internal/docfill/p0_test.go` +- Modify: `cmd/docfill/main_test.go` + +- [ ] Add tests for coded missing-field and output-exists failures. +- [ ] Add tests for CLI stderr formatting with `[CODE]`, `hint:`, and `context:`. + +### Task 2: Error Classification + +**Files:** +- Modify: `internal/docfill/docfill.go` +- Create: `internal/docfill/errors.go` + +- [ ] Classify config read, config parse, config validate, data Excel, data SQLite, template, output, and unresolved-placeholder failures where they already occur. +- [ ] Keep existing return signatures. + +### Task 3: Verbose Logs + +**Files:** +- Modify: `internal/docfill/docfill.go` +- Modify: `cmd/docfill/main.go` +- Modify: `cmd/docfill/main_test.go` + +- [ ] Add `RunOptions.Logf`. +- [ ] Add `--verbose` to `docfill run`. +- [ ] Log only config load, data read summary, and per-row output path. + +### Task 4: Docs And Verification + +**Files:** +- Modify: `README.md` +- Modify: `docs/digital-employee-runbook.md` + +- [ ] Document error shape and `--verbose`. +- [ ] Run `go test -count=1 ./...`. +- [ ] Run `bash scripts/smoke.sh`. +- [ ] Run `bash scripts/build.sh`. diff --git a/examples/README.md b/examples/README.md index bb68185..4fa66ac 100644 --- a/examples/README.md +++ b/examples/README.md @@ -1,16 +1,32 @@ -# docfill examples +# docfill 示例配置 -These examples are intentionally small and script-friendly. +本目录保存可自动化运行的最小示例配置。示例中的 Office 文件和 SQLite 文件由 `scripts/smoke.sh` 在临时目录中生成,因此仓库只提交配置文件,不提交临时生成的数据文件。 -Run all examples through the smoke script: +## 运行全部示例 ```bash bash scripts/smoke.sh ``` -The smoke script copies this directory to a temp folder, generates the Office and SQLite fixture files, builds `docfill`, and runs the example tasks. +输出示例: -## Examples +```text +generated 2 file(s) +- /tmp/.../examples/excel-to-word/out/daily_2026-06-18_张三_1.docx +- /tmp/.../examples/excel-to-word/out/daily_2026-06-18_李四_2.docx +generated 2 file(s) +- /tmp/.../examples/sqlite-to-excel/out/summary_客服部_1.xlsx +- /tmp/.../examples/sqlite-to-excel/out/summary_营销部_2.xlsx +smoke ok +``` -- `excel-to-word`: Excel daily rows to Word daily reports. -- `sqlite-to-excel`: SQLite summary rows to Excel department reports. +## 示例列表 + +- `excel-to-word`: 从 Excel 日报数据生成 Word 日报。 +- `excel-filter-to-word`: 从 Excel 工单数据中按日期和工单编号筛选一条记录,再生成 Word 工单。 +- `sqlite-to-excel`: 从 SQLite 汇总数据生成 Excel 部门汇总表。 + +## 与 manual_tests 的区别 + +- `examples/` 用于自动化冒烟测试,文件尽量少,数据文件运行时临时生成。 +- `manual_tests/` 用于人工验证,包含可以直接打开的 Word、Excel 和 SQLite 测试素材。 diff --git a/examples/excel-filter-to-word/task.json b/examples/excel-filter-to-word/task.json new file mode 100644 index 0000000..66d1f1a --- /dev/null +++ b/examples/excel-filter-to-word/task.json @@ -0,0 +1,25 @@ +{ + "vars": { + "date": "2026-06-18" + }, + "data": { + "type": "excel", + "path": "./data.xlsx", + "sheet": "Tickets", + "header_row": 1 + }, + "filter": { + "equals": { + "date": "{{date}}", + "ticket_no": "{{ticket_no}}" + }, + "expect": "one" + }, + "template": { + "path": "./template.docx" + }, + "output": { + "path": "./out/ticket_{{date}}_{{ticket_no}}.docx", + "overwrite": true + } +} diff --git a/internal/docfill/docfill.go b/internal/docfill/docfill.go index 0098f16..60a6e24 100644 --- a/internal/docfill/docfill.go +++ b/internal/docfill/docfill.go @@ -4,12 +4,12 @@ import ( "archive/zip" "database/sql" "encoding/json" - "errors" "fmt" "io" "os" "path/filepath" "regexp" + "sort" "strconv" "strings" @@ -21,6 +21,7 @@ import ( type config struct { Vars map[string]string `json:"vars"` Data dataConfig `json:"data"` + Filter filterConfig `json:"filter"` Template templateConfig `json:"template"` Output outputConfig `json:"output"` } @@ -34,6 +35,11 @@ type dataConfig struct { HeaderRow int `json:"header_row"` } +type filterConfig struct { + Equals map[string]string `json:"equals"` + Expect string `json:"expect"` +} + type templateConfig struct { Path string `json:"path"` } @@ -45,6 +51,7 @@ type outputConfig struct { type RunOptions struct { Vars map[string]string + Logf func(format string, args ...any) } type RunResult struct { @@ -68,6 +75,7 @@ func Run(configPath string) error { // RunWithOptions executes one configured fill task and returns generated files. func RunWithOptions(configPath string, opts RunOptions) (RunResult, error) { + logf(opts, "load config path=%s", configPath) cfg, err := loadConfig(configPath) if err != nil { return RunResult{}, err @@ -77,12 +85,24 @@ func RunWithOptions(configPath string, opts RunOptions) (RunResult, error) { } vars := mergeVars(cfg.Vars, opts.Vars) + logf(opts, "read data type=%s path=%s", cfg.Data.Type, cfg.Data.Path) rows, err := readRowsWithVars(cfg.Data, vars) if err != nil { return RunResult{}, err } if len(rows) == 0 { - return RunResult{}, errors.New("data returned no rows") + return RunResult{}, appError(CodeDataEmpty, "data returned no rows"). + withHint("Check the data source, sheet/header row, SQL where clause, or --var values."). + withContext("data", cfg.Data.Path) + } + logf(opts, "read data type=%s path=%s rows=%d", cfg.Data.Type, cfg.Data.Path, len(rows)) + sourceRowCount := len(rows) + rows, err = filterRows(cfg.Filter, rows, vars) + if err != nil { + return RunResult{}, err + } + if hasFilter(cfg.Filter) { + logf(opts, "filter rows=%d matched=%d expect=%s", sourceRowCount, len(rows), filterExpect(cfg.Filter)) } result := RunResult{Files: make([]string, 0, len(rows))} @@ -94,11 +114,16 @@ func RunWithOptions(configPath string, opts RunOptions) (RunResult, error) { outputPath := replacePathPlaceholders(cfg.Output.Path, context) if hasPlaceholder(outputPath) { - return RunResult{}, fmt.Errorf("render row %d: unresolved placeholder in output path %q", i+1, outputPath) + return RunResult{}, fmt.Errorf("render row %d: %w", i+1, appError(CodeTemplateUnresolved, "unresolved placeholder in output path"). + withHint("Check output.path placeholders and available data fields or --var values."). + withContext("output", outputPath)) } if !cfg.Output.Overwrite && fileExists(outputPath) { - return RunResult{}, fmt.Errorf("render row %d: output already exists: %s", i+1, outputPath) + return RunResult{}, fmt.Errorf("render row %d: %w", i+1, appError(CodeOutputExists, "output already exists"). + withHint("Change output.path or set output.overwrite to true."). + withContext("output", outputPath)) } + logf(opts, "render row=%d output=%s", i+1, outputPath) if err := renderTemplate(cfg.Template.Path, outputPath, context); err != nil { return RunResult{}, fmt.Errorf("render row %d: %w", i+1, err) } @@ -109,19 +134,32 @@ func RunWithOptions(configPath string, opts RunOptions) (RunResult, error) { return result, nil } +func logf(opts RunOptions, format string, args ...any) { + if opts.Logf != nil { + opts.Logf(format, args...) + } +} + func loadConfig(path string) (config, error) { if path == "" { - return config{}, errors.New("config path is required") + return config{}, appError(CodeConfigValidate, "config path is required"). + withHint("Pass -c task.json or --config task.json.") } data, err := os.ReadFile(path) if err != nil { - return config{}, fmt.Errorf("read config: %w", err) + return config{}, appError(CodeConfigRead, "read config"). + withHint("Check that the config file exists and is readable."). + withContext("config", path). + withCause(err) } var cfg config if err := json.Unmarshal(data, &cfg); err != nil { - return config{}, fmt.Errorf("parse config json: %w", err) + return config{}, appError(CodeConfigParse, "parse config json"). + withHint("Fix task.json syntax and make sure it is valid JSON."). + withContext("config", path). + withCause(err) } resolveConfigPaths(&cfg, filepath.Dir(absPath(path))) return cfg, nil @@ -129,19 +167,27 @@ func loadConfig(path string) (config, error) { func validateConfig(cfg config) error { if cfg.Data.Type == "" { - return errors.New("data.type is required") + return appError(CodeConfigValidate, "data.type is required"). + withHint("Set data.type to excel or sqlite.") } if cfg.Data.Path == "" { - return errors.New("data.path is required") + return appError(CodeConfigValidate, "data.path is required"). + withHint("Set data.path to an .xlsx or .db file.") } if cfg.Template.Path == "" { - return errors.New("template.path is required") + return appError(CodeConfigValidate, "template.path is required"). + withHint("Set template.path to a .docx or .xlsx file.") } if cfg.Output.Path == "" { - return errors.New("output.path is required") + return appError(CodeConfigValidate, "output.path is required"). + withHint("Set output.path to the generated file pattern.") } if cfg.Data.HeaderRow < 0 { - return errors.New("data.header_row must not be negative") + return appError(CodeConfigValidate, "data.header_row must not be negative"). + withHint("Use a 1-based header_row value, or omit it for 1.") + } + if err := validateFilterConfig(cfg.Filter); err != nil { + return err } return nil } @@ -157,14 +203,19 @@ func readRowsWithVars(cfg dataConfig, vars map[string]string) ([]map[string]stri case "sqlite": return readSQLiteRows(cfg, vars) default: - return nil, fmt.Errorf("unsupported data.type %q", cfg.Type) + return nil, appError(CodeConfigValidate, fmt.Sprintf("unsupported data.type %q", cfg.Type)). + withHint("Set data.type to excel or sqlite."). + withContext("data.type", cfg.Type) } } func readExcelRows(cfg dataConfig) ([]map[string]string, error) { f, err := excelize.OpenFile(cfg.Path) if err != nil { - return nil, fmt.Errorf("open excel data: %w", err) + return nil, appError(CodeDataExcel, "open excel data"). + withHint("Check that data.path points to a readable .xlsx file."). + withContext("data", cfg.Path). + withCause(err) } defer f.Close() @@ -173,15 +224,24 @@ func readExcelRows(cfg dataConfig) ([]map[string]string, error) { sheet = f.GetSheetName(0) } if sheet == "" { - return nil, errors.New("excel data has no sheets") + return nil, appError(CodeDataExcel, "excel data has no sheets"). + withHint("Check the Excel data file."). + withContext("data", cfg.Path) } rawRows, err := f.GetRows(sheet) if err != nil { - return nil, fmt.Errorf("read excel sheet %q: %w", sheet, err) + return nil, appError(CodeDataExcel, fmt.Sprintf("read excel sheet %q", sheet)). + withHint("Check data.sheet and the workbook contents."). + withContext("data", cfg.Path). + withContext("sheet", sheet). + withCause(err) } if len(rawRows) == 0 { - return nil, errors.New("excel data has no header row") + return nil, appError(CodeDataExcel, "excel data has no header row"). + withHint("Add a header row or set data.header_row to the correct row."). + withContext("data", cfg.Path). + withContext("sheet", sheet) } headerRow := cfg.HeaderRow @@ -189,7 +249,10 @@ func readExcelRows(cfg dataConfig) ([]map[string]string, error) { headerRow = 1 } if headerRow > len(rawRows) { - return nil, fmt.Errorf("excel header_row %d is outside sheet %q", headerRow, sheet) + return nil, appError(CodeDataExcel, fmt.Sprintf("excel header_row %d is outside sheet %q", headerRow, sheet)). + withHint("Use a header_row value within the sheet row count."). + withContext("data", cfg.Path). + withContext("sheet", sheet) } headers := make([]string, len(rawRows[headerRow-1])) @@ -221,12 +284,16 @@ func readExcelRows(cfg dataConfig) ([]map[string]string, error) { func readSQLiteRows(cfg dataConfig, vars map[string]string) ([]map[string]string, error) { if cfg.Query == "" { - return nil, errors.New("data.query is required for sqlite") + return nil, appError(CodeConfigValidate, "data.query is required for sqlite"). + withHint("Set data.query to the SQL select statement.") } db, err := sql.Open("sqlite", cfg.Path) if err != nil { - return nil, fmt.Errorf("open sqlite data: %w", err) + return nil, appError(CodeDataSQLite, "open sqlite data"). + withHint("Check that data.path points to a readable SQLite database."). + withContext("data", cfg.Path). + withCause(err) } defer db.Close() @@ -237,13 +304,18 @@ func readSQLiteRows(cfg dataConfig, vars map[string]string) ([]map[string]string result, err := db.Query(cfg.Query, args...) if err != nil { - return nil, fmt.Errorf("query sqlite data: %w", err) + return nil, appError(CodeDataSQLite, "query sqlite data"). + withHint("Check data.query, data.params, and --var values."). + withContext("data", cfg.Path). + withCause(err) } defer result.Close() columns, err := result.Columns() if err != nil { - return nil, fmt.Errorf("read sqlite columns: %w", err) + return nil, appError(CodeDataSQLite, "read sqlite columns"). + withContext("data", cfg.Path). + withCause(err) } var rows []map[string]string @@ -254,7 +326,9 @@ func readSQLiteRows(cfg dataConfig, vars map[string]string) ([]map[string]string scanTargets[i] = &values[i] } if err := result.Scan(scanTargets...); err != nil { - return nil, fmt.Errorf("scan sqlite row: %w", err) + return nil, appError(CodeDataSQLite, "scan sqlite row"). + withContext("data", cfg.Path). + withCause(err) } row := make(map[string]string) @@ -264,18 +338,154 @@ func readSQLiteRows(cfg dataConfig, vars map[string]string) ([]map[string]string rows = append(rows, row) } if err := result.Err(); err != nil { - return nil, fmt.Errorf("iterate sqlite rows: %w", err) + return nil, appError(CodeDataSQLite, "iterate sqlite rows"). + withContext("data", cfg.Path). + withCause(err) } return rows, nil } +func validateFilterConfig(cfg filterConfig) error { + expect := strings.ToLower(strings.TrimSpace(cfg.Expect)) + if expect != "" && expect != "one" && expect != "many" { + return appError(CodeConfigValidate, fmt.Sprintf("unsupported filter.expect %q", cfg.Expect)). + withHint("Set filter.expect to one or many."). + withContext("filter.expect", cfg.Expect) + } + if expect != "" && len(cfg.Equals) == 0 { + return appError(CodeConfigValidate, "filter.equals is required when filter.expect is set"). + withHint("Add at least one filter.equals condition or remove filter.expect.") + } + for field := range cfg.Equals { + if strings.TrimSpace(field) == "" { + return appError(CodeConfigValidate, "filter.equals field name must not be empty"). + withHint("Use a data column name as each filter.equals key.") + } + } + return nil +} + +func filterRows(cfg filterConfig, rows []map[string]string, vars map[string]string) ([]map[string]string, error) { + if !hasFilter(cfg) { + return rows, nil + } + + conditions, err := filterConditions(cfg, vars) + if err != nil { + return nil, err + } + if len(rows) > 0 { + if err := validateFilterFields(rows[0], conditions); err != nil { + return nil, err + } + } + + matches := make([]map[string]string, 0, len(rows)) + for _, row := range rows { + if rowMatchesFilter(row, conditions) { + matches = append(matches, row) + } + } + + expect := filterExpect(cfg) + if len(matches) == 0 { + return nil, appError(CodeDataFilterNoMatch, "filter matched no rows"). + withHint("Check filter.equals, --var values, or source table contents."). + withContext("filter", filterSummary(conditions)). + withContext("expect", expect) + } + if expect == "one" && len(matches) != 1 { + return nil, appError(CodeDataFilterMultiMatch, fmt.Sprintf("filter matched %d rows but expected one", len(matches))). + withHint("Add another filter condition or clean duplicate rows in the source table."). + withContext("filter", filterSummary(conditions)). + withContext("matches", strconv.Itoa(len(matches))) + } + + return matches, nil +} + +func hasFilter(cfg filterConfig) bool { + return len(cfg.Equals) > 0 +} + +func filterExpect(cfg filterConfig) string { + expect := strings.ToLower(strings.TrimSpace(cfg.Expect)) + if expect == "" { + return "one" + } + return expect +} + +func filterConditions(cfg filterConfig, vars map[string]string) (map[string]string, error) { + conditions := make(map[string]string, len(cfg.Equals)) + for field, pattern := range cfg.Equals { + field = strings.TrimSpace(field) + context := map[string]string{"filter": field} + if err := ensurePlaceholdersAvailableWithCode( + fmt.Sprintf("filter.equals[%s]", field), + pattern, + vars, + CodeDataFilterValue, + "Provide the missing filter value with vars or --var.", + context, + ); err != nil { + return nil, err + } + value := replacePlaceholders(pattern, vars) + if hasPlaceholder(value) { + return nil, appError(CodeDataFilterValue, fmt.Sprintf("unresolved placeholder in filter.equals[%s]", field)). + withHint("Provide the missing filter value with vars or --var."). + withContext("filter", field) + } + conditions[field] = strings.TrimSpace(value) + } + return conditions, nil +} + +func validateFilterFields(row map[string]string, conditions map[string]string) error { + for field := range conditions { + if _, ok := row[field]; !ok { + return appError(CodeDataFilterField, fmt.Sprintf("filter field %q is not in data", field)). + withHint("Check the data header/query columns or adjust filter.equals."). + withContext("field", field) + } + } + return nil +} + +func rowMatchesFilter(row map[string]string, conditions map[string]string) bool { + for field, want := range conditions { + if strings.TrimSpace(row[field]) != want { + return false + } + } + return true +} + +func filterSummary(conditions map[string]string) string { + keys := make([]string, 0, len(conditions)) + for key := range conditions { + keys = append(keys, key) + } + sort.Strings(keys) + + parts := make([]string, 0, len(keys)) + for _, key := range keys { + parts = append(parts, key+"="+conditions[key]) + } + return strings.Join(parts, ",") +} + func renderTemplate(templatePath, outputPath string, row map[string]string) error { if err := validateTemplateFields(templatePath, row); err != nil { return err } if err := os.MkdirAll(filepath.Dir(outputPath), 0o755); err != nil { - return fmt.Errorf("create output directory: %w", err) + return appError(CodeOutputWrite, "create output directory"). + withHint("Check output.path directory permissions."). + withContext("output", outputPath). + withCause(err) } switch strings.ToLower(filepath.Ext(templatePath)) { @@ -284,21 +494,29 @@ func renderTemplate(templatePath, outputPath string, row map[string]string) erro case ".docx": return renderDOCX(templatePath, outputPath, row) default: - return fmt.Errorf("unsupported template extension %q", filepath.Ext(templatePath)) + return appError(CodeConfigValidate, fmt.Sprintf("unsupported template extension %q", filepath.Ext(templatePath))). + withHint("Use a .docx or .xlsx template."). + withContext("template", templatePath) } } func renderXLSX(templatePath, outputPath string, row map[string]string) error { f, err := excelize.OpenFile(templatePath) if err != nil { - return fmt.Errorf("open xlsx template: %w", err) + return appError(CodeTemplateOpen, "open xlsx template"). + withHint("Check that template.path points to a readable .xlsx file."). + withContext("template", templatePath). + withCause(err) } defer f.Close() for _, sheet := range f.GetSheetList() { rows, err := f.GetRows(sheet) if err != nil { - return fmt.Errorf("read template sheet %q: %w", sheet, err) + return appError(CodeTemplateOpen, fmt.Sprintf("read template sheet %q", sheet)). + withContext("template", templatePath). + withContext("sheet", sheet). + withCause(err) } for r, values := range rows { for c, value := range values { @@ -311,17 +529,25 @@ func renderXLSX(templatePath, outputPath string, row map[string]string) error { } rendered := replacePlaceholders(value, row) if hasPlaceholder(rendered) { - return fmt.Errorf("unresolved placeholder in %s!%s", sheet, cell) + return appError(CodeTemplateUnresolved, fmt.Sprintf("unresolved placeholder in %s!%s", sheet, cell)). + withHint("Check source data values and template placeholders."). + withContext("template", templatePath). + withContext("cell", sheet+"!"+cell) } if err := f.SetCellValue(sheet, cell, rendered); err != nil { - return fmt.Errorf("set cell %s!%s: %w", sheet, cell, err) + return appError(CodeOutputWrite, fmt.Sprintf("set cell %s!%s", sheet, cell)). + withContext("output", outputPath). + withCause(err) } } } } if err := f.SaveAs(outputPath); err != nil { - return fmt.Errorf("save xlsx output: %w", err) + return appError(CodeOutputWrite, "save xlsx output"). + withHint("Check output.path and file permissions."). + withContext("output", outputPath). + withCause(err) } return nil } @@ -329,13 +555,19 @@ func renderXLSX(templatePath, outputPath string, row map[string]string) error { func renderDOCX(templatePath, outputPath string, row map[string]string) error { reader, err := zip.OpenReader(templatePath) if err != nil { - return fmt.Errorf("open docx template: %w", err) + return appError(CodeTemplateOpen, "open docx template"). + withHint("Check that template.path points to a readable .docx file."). + withContext("template", templatePath). + withCause(err) } defer reader.Close() output, err := os.Create(outputPath) if err != nil { - return fmt.Errorf("create docx output: %w", err) + return appError(CodeOutputWrite, "create docx output"). + withHint("Check output.path and file permissions."). + withContext("output", outputPath). + withCause(err) } writer := zip.NewWriter(output) @@ -348,10 +580,14 @@ func renderDOCX(templatePath, outputPath string, row map[string]string) error { } if err := writer.Close(); err != nil { _ = output.Close() - return fmt.Errorf("close docx output: %w", err) + return appError(CodeOutputWrite, "close docx output"). + withContext("output", outputPath). + withCause(err) } if err := output.Close(); err != nil { - return fmt.Errorf("close docx file: %w", err) + return appError(CodeOutputWrite, "close docx file"). + withContext("output", outputPath). + withCause(err) } return nil @@ -364,7 +600,8 @@ func copyDocxPart(writer *zip.Writer, source *zip.File, row map[string]string) e dest, err := writer.CreateHeader(&header) if err != nil { - return fmt.Errorf("create docx part %s: %w", source.Name, err) + return appError(CodeOutputWrite, fmt.Sprintf("create docx part %s", source.Name)). + withCause(err) } if source.FileInfo().IsDir() { @@ -373,13 +610,15 @@ func copyDocxPart(writer *zip.Writer, source *zip.File, row map[string]string) e src, err := source.Open() if err != nil { - return fmt.Errorf("open docx part %s: %w", source.Name, err) + return appError(CodeTemplateOpen, fmt.Sprintf("open docx part %s", source.Name)). + withCause(err) } defer src.Close() data, err := io.ReadAll(src) if err != nil { - return fmt.Errorf("read docx part %s: %w", source.Name, err) + return appError(CodeTemplateOpen, fmt.Sprintf("read docx part %s", source.Name)). + withCause(err) } if isDocxXMLPart(source.Name) { rendered, err := renderDocxXML(string(data), row) @@ -387,13 +626,15 @@ func copyDocxPart(writer *zip.Writer, source *zip.File, row map[string]string) e return fmt.Errorf("render docx part %s: %w", source.Name, err) } if docxHasPlaceholder(rendered) { - return fmt.Errorf("unresolved placeholder in docx part %s", source.Name) + return appError(CodeTemplateUnresolved, fmt.Sprintf("unresolved placeholder in docx part %s", source.Name)). + withHint("Check source data values and template placeholders.") } data = []byte(rendered) } if _, err := dest.Write(data); err != nil { - return fmt.Errorf("write docx part %s: %w", source.Name, err) + return appError(CodeOutputWrite, fmt.Sprintf("write docx part %s", source.Name)). + withCause(err) } return nil } @@ -471,12 +712,20 @@ func renderContext(vars, row map[string]string, rowNumber int) map[string]string func sqliteParams(params []string, vars map[string]string) ([]any, error) { args := make([]any, 0, len(params)) for i, param := range params { - if err := ensurePlaceholdersAvailable(fmt.Sprintf("sqlite params[%d]", i), param, vars); err != nil { + if err := ensurePlaceholdersAvailableWithCode( + fmt.Sprintf("sqlite params[%d]", i), + param, + vars, + CodeDataSQLite, + "Provide the missing SQLite parameter with vars or --var.", + nil, + ); err != nil { return nil, err } rendered := replacePlaceholders(param, vars) if hasPlaceholder(rendered) { - return nil, fmt.Errorf("unresolved placeholder in sqlite params[%d]", i) + return nil, appError(CodeDataSQLite, fmt.Sprintf("unresolved placeholder in sqlite params[%d]", i)). + withHint("Provide the missing SQLite parameter with vars or --var.") } args = append(args, rendered) } @@ -490,7 +739,10 @@ func validateTemplateFields(templatePath string, row map[string]string) error { } for field := range fields { if _, ok := row[field]; !ok { - return fmt.Errorf("missing template field %q", field) + return appError(CodeTemplateFieldMissing, fmt.Sprintf("missing template field %q", field)). + withHint(fmt.Sprintf("Add column %q to the data source or pass --var %s=...", field, field)). + withContext("field", field). + withContext("template", templatePath) } } return nil @@ -510,7 +762,10 @@ func templatePlaceholders(templatePath string) (map[string]struct{}, error) { func xlsxPlaceholders(templatePath string) (map[string]struct{}, error) { f, err := excelize.OpenFile(templatePath) if err != nil { - return nil, fmt.Errorf("open xlsx template: %w", err) + return nil, appError(CodeTemplateOpen, "open xlsx template"). + withHint("Check that template.path points to a readable .xlsx file."). + withContext("template", templatePath). + withCause(err) } defer f.Close() @@ -518,7 +773,10 @@ func xlsxPlaceholders(templatePath string) (map[string]struct{}, error) { for _, sheet := range f.GetSheetList() { rows, err := f.GetRows(sheet) if err != nil { - return nil, fmt.Errorf("read template sheet %q: %w", sheet, err) + return nil, appError(CodeTemplateOpen, fmt.Sprintf("read template sheet %q", sheet)). + withContext("template", templatePath). + withContext("sheet", sheet). + withCause(err) } for _, row := range rows { for _, value := range row { @@ -532,7 +790,10 @@ func xlsxPlaceholders(templatePath string) (map[string]struct{}, error) { func docxPlaceholders(templatePath string) (map[string]struct{}, error) { reader, err := zip.OpenReader(templatePath) if err != nil { - return nil, fmt.Errorf("open docx template: %w", err) + return nil, appError(CodeTemplateOpen, "open docx template"). + withHint("Check that template.path points to a readable .docx file."). + withContext("template", templatePath). + withCause(err) } defer reader.Close() @@ -543,15 +804,21 @@ func docxPlaceholders(templatePath string) (map[string]struct{}, error) { } rc, err := file.Open() if err != nil { - return nil, fmt.Errorf("open docx part %s: %w", file.Name, err) + return nil, appError(CodeTemplateOpen, fmt.Sprintf("open docx part %s", file.Name)). + withContext("template", templatePath). + withCause(err) } data, readErr := io.ReadAll(rc) closeErr := rc.Close() if readErr != nil { - return nil, fmt.Errorf("read docx part %s: %w", file.Name, readErr) + return nil, appError(CodeTemplateOpen, fmt.Sprintf("read docx part %s", file.Name)). + withContext("template", templatePath). + withCause(readErr) } if closeErr != nil { - return nil, fmt.Errorf("close docx part %s: %w", file.Name, closeErr) + return nil, appError(CodeTemplateOpen, fmt.Sprintf("close docx part %s", file.Name)). + withContext("template", templatePath). + withCause(closeErr) } xml := string(data) addPlaceholders(fields, xml) @@ -561,11 +828,28 @@ func docxPlaceholders(templatePath string) (map[string]struct{}, error) { } func ensurePlaceholdersAvailable(label, text string, row map[string]string) error { + return ensurePlaceholdersAvailableWithCode( + label, + text, + row, + CodeTemplateFieldMissing, + "Add the missing field to the data source or pass it with --var.", + nil, + ) +} + +func ensurePlaceholdersAvailableWithCode(label, text string, row map[string]string, code ErrorCode, hint string, context map[string]string) error { fields := make(map[string]struct{}) addPlaceholders(fields, text) for field := range fields { if _, ok := row[field]; !ok { - return fmt.Errorf("missing %s field %q", label, field) + err := appError(code, fmt.Sprintf("missing %s field %q", label, field)). + withHint(hint). + withContext("field", field) + for key, value := range context { + err.withContext(key, value) + } + return err } } return nil @@ -637,7 +921,8 @@ func renderDocxTextGroup(xml string, row map[string]string) (string, error) { } rendered := replaceDocxPlaceholders(joined, row) if hasPlaceholder(rendered) { - return "", errors.New("unresolved placeholder in docx text") + return "", appError(CodeTemplateUnresolved, "unresolved placeholder in docx text"). + withHint("Check source data values and template placeholders.") } var out strings.Builder diff --git a/internal/docfill/docfill_test.go b/internal/docfill/docfill_test.go index 5ae97b5..f09fb25 100644 --- a/internal/docfill/docfill_test.go +++ b/internal/docfill/docfill_test.go @@ -153,6 +153,30 @@ func TestRenderDOCXReplacesPlaceholderSplitAcrossTextNodes(t *testing.T) { } } +func TestRenderDOCXReplacesMultipleSplitPlaceholdersInSameParagraph(t *testing.T) { + dir := t.TempDir() + templatePath := filepath.Join(dir, "template.docx") + outputPath := filepath.Join(dir, "out.docx") + writeMinimalDocx(t, templatePath, `员工:{{name}},完成:{{done}},备注:{{note}}`) + + err := renderTemplate(templatePath, outputPath, map[string]string{ + "name": "Alice", + "done": "接口数据整理", + "note": "保持同段落", + }) + if err != nil { + t.Fatalf("renderTemplate returned error: %v", err) + } + + got := readZipEntry(t, outputPath, "word/document.xml") + if !strings.Contains(got, "员工:Alice,完成:接口数据整理,备注:保持同段落") { + t.Fatalf("document.xml = %q, want rendered split placeholders", got) + } + if strings.Contains(got, "{{") || strings.Contains(got, "}}") { + t.Fatalf("document.xml still has placeholder markers: %q", got) + } +} + func TestRunGeneratesOneOutputPerInputRow(t *testing.T) { dir := t.TempDir() dataPath := filepath.Join(dir, "data.xlsx") diff --git a/internal/docfill/errors.go b/internal/docfill/errors.go new file mode 100644 index 0000000..4eebb01 --- /dev/null +++ b/internal/docfill/errors.go @@ -0,0 +1,74 @@ +package docfill + +type ErrorCode string + +const ( + CodeCLIUsage ErrorCode = "CLI_USAGE" + CodeConfigRead ErrorCode = "CONFIG_READ" + CodeConfigParse ErrorCode = "CONFIG_PARSE" + CodeConfigValidate ErrorCode = "CONFIG_VALIDATE" + CodeDataExcel ErrorCode = "DATA_EXCEL" + CodeDataSQLite ErrorCode = "DATA_SQLITE" + CodeDataEmpty ErrorCode = "DATA_EMPTY" + CodeDataFilterField ErrorCode = "DATA_FILTER_FIELD" + CodeDataFilterValue ErrorCode = "DATA_FILTER_VALUE" + CodeDataFilterNoMatch ErrorCode = "DATA_FILTER_NO_MATCH" + CodeDataFilterMultiMatch ErrorCode = "DATA_FILTER_MULTI_MATCH" + CodeTemplateOpen ErrorCode = "TEMPLATE_OPEN" + CodeTemplateFieldMissing ErrorCode = "TEMPLATE_FIELD_MISSING" + CodeTemplateUnresolved ErrorCode = "TEMPLATE_UNRESOLVED" + CodeOutputExists ErrorCode = "OUTPUT_EXISTS" + CodeOutputWrite ErrorCode = "OUTPUT_WRITE" + CodeInternal ErrorCode = "INTERNAL" +) + +type AppError struct { + Code ErrorCode + Message string + Hint string + Context map[string]string + Cause error +} + +func (e *AppError) Error() string { + if e == nil { + return "" + } + if e.Cause == nil { + return e.Message + } + return e.Message + ": " + e.Cause.Error() +} + +func (e *AppError) Unwrap() error { + if e == nil { + return nil + } + return e.Cause +} + +func appError(code ErrorCode, message string) *AppError { + return &AppError{ + Code: code, + Message: message, + Context: make(map[string]string), + } +} + +func (e *AppError) withHint(hint string) *AppError { + e.Hint = hint + return e +} + +func (e *AppError) withCause(cause error) *AppError { + e.Cause = cause + return e +} + +func (e *AppError) withContext(key, value string) *AppError { + if e.Context == nil { + e.Context = make(map[string]string) + } + e.Context[key] = value + return e +} diff --git a/internal/docfill/p0_test.go b/internal/docfill/p0_test.go index b4d5bb5..1053df5 100644 --- a/internal/docfill/p0_test.go +++ b/internal/docfill/p0_test.go @@ -2,6 +2,7 @@ package docfill import ( "database/sql" + "errors" "os" "path/filepath" "strings" @@ -176,6 +177,16 @@ func TestRunRefusesToOverwriteUnlessConfigured(t *testing.T) { if err == nil || !strings.Contains(err.Error(), "already exists") { t.Fatalf("expected already exists error, got %v", err) } + var appErr *AppError + if !errors.As(err, &appErr) { + t.Fatalf("expected AppError, got %T", err) + } + if appErr.Code != CodeOutputExists { + t.Fatalf("error code = %s, want %s", appErr.Code, CodeOutputExists) + } + if appErr.Hint == "" || appErr.Context["output"] != outputPath { + t.Fatalf("expected hint and output context, got %#v", appErr) + } writeJSON(t, configPath, map[string]any{ "data": map[string]any{ @@ -226,6 +237,19 @@ func TestRunFailsWhenTemplatePlaceholderIsMissing(t *testing.T) { if err == nil || !strings.Contains(err.Error(), "missing template field") { t.Fatalf("expected missing template field error, got %v", err) } + var appErr *AppError + if !errors.As(err, &appErr) { + t.Fatalf("expected AppError, got %T", err) + } + if appErr.Code != CodeTemplateFieldMissing { + t.Fatalf("error code = %s, want %s", appErr.Code, CodeTemplateFieldMissing) + } + if appErr.Context["field"] != "missing" || appErr.Context["template"] != templatePath { + t.Fatalf("unexpected context: %#v", appErr.Context) + } + if !strings.Contains(appErr.Hint, "missing") { + t.Fatalf("unexpected hint: %q", appErr.Hint) + } } func TestRunFailsWhenRenderedTemplateStillHasPlaceholder(t *testing.T) { @@ -259,6 +283,282 @@ func TestRunFailsWhenRenderedTemplateStillHasPlaceholder(t *testing.T) { } } +func TestRunFiltersExcelRowsByMultipleEqualsAndVars(t *testing.T) { + dir := t.TempDir() + dataPath := filepath.Join(dir, "tickets.xlsx") + templatePath := filepath.Join(dir, "ticket-template.xlsx") + configPath := filepath.Join(dir, "task.json") + + writeWorkbook(t, dataPath, "工单", [][]string{ + {"日期", "工单编号", "客户名称", "处理结果"}, + {"2026-06-18", "GD-001", "A 公司", "已派单"}, + {"2026-06-18", "GD-002", "B 公司", "已完成"}, + {"2026-06-19", "GD-001", "C 公司", "待复核"}, + }) + writeWorkbook(t, templatePath, "工单", [][]string{ + {"编号", "{{工单编号}}"}, + {"客户", "{{客户名称}}"}, + {"结果", "{{处理结果}}"}, + }) + writeJSON(t, configPath, map[string]any{ + "vars": map[string]any{ + "date": "2026-06-17", + }, + "data": map[string]any{ + "type": "excel", + "path": dataPath, + "sheet": "工单", + }, + "filter": map[string]any{ + "equals": map[string]any{ + "日期": "{{date}}", + "工单编号": "{{ticket_no}}", + }, + }, + "template": map[string]any{ + "path": templatePath, + }, + "output": map[string]any{ + "path": filepath.Join(dir, "out", "工单_{{日期}}_{{工单编号}}.xlsx"), + }, + }) + + result, err := RunWithOptions(configPath, RunOptions{ + Vars: map[string]string{ + "date": "2026-06-18", + "ticket_no": "GD-002", + }, + }) + if err != nil { + t.Fatalf("RunWithOptions returned error: %v", err) + } + + wantPath := filepath.Join(dir, "out", "工单_2026-06-18_GD-002.xlsx") + if len(result.Files) != 1 || result.Files[0] != wantPath { + t.Fatalf("result files = %#v, want only %q", result.Files, wantPath) + } + assertWorkbookCell(t, wantPath, "工单", "B2", "B 公司") + assertWorkbookCell(t, wantPath, "工单", "B3", "已完成") +} + +func TestRunFilterAllowsManyRowsWhenConfigured(t *testing.T) { + dir := t.TempDir() + dbPath := filepath.Join(dir, "tickets.db") + templatePath := filepath.Join(dir, "ticket-template.xlsx") + configPath := filepath.Join(dir, "task.json") + + seedP0SQLite(t, dbPath, ` + create table tickets ( + report_date text, + department text, + ticket_no text, + result text + ); + insert into tickets values + ('2026-06-18', '营销部', 'GD-001', '已派单'), + ('2026-06-18', '客服部', 'GD-002', '已完成'), + ('2026-06-19', '营销部', 'GD-003', '待复核'); + `) + writeWorkbook(t, templatePath, "工单", [][]string{ + {"编号", "{{ticket_no}}"}, + {"部门", "{{department}}"}, + {"结果", "{{result}}"}, + }) + writeJSON(t, configPath, map[string]any{ + "data": map[string]any{ + "type": "sqlite", + "path": dbPath, + "query": "select report_date, department, ticket_no, result from tickets order by ticket_no", + }, + "filter": map[string]any{ + "equals": map[string]any{ + "report_date": "{{date}}", + }, + "expect": "many", + }, + "template": map[string]any{ + "path": templatePath, + }, + "output": map[string]any{ + "path": filepath.Join(dir, "out", "工单_{{ticket_no}}_{{_row}}.xlsx"), + }, + }) + + result, err := RunWithOptions(configPath, RunOptions{Vars: map[string]string{"date": "2026-06-18"}}) + if err != nil { + t.Fatalf("RunWithOptions returned error: %v", err) + } + + if len(result.Files) != 2 { + t.Fatalf("expected 2 filtered files, got %#v", result.Files) + } + assertWorkbookCell(t, filepath.Join(dir, "out", "工单_GD-001_1.xlsx"), "工单", "B3", "已派单") + assertWorkbookCell(t, filepath.Join(dir, "out", "工单_GD-002_2.xlsx"), "工单", "B2", "客服部") +} + +func TestRunFilterFailsWhenNoRowsMatch(t *testing.T) { + dir := t.TempDir() + dataPath := filepath.Join(dir, "tickets.xlsx") + templatePath := filepath.Join(dir, "template.xlsx") + configPath := filepath.Join(dir, "task.json") + + writeWorkbook(t, dataPath, "工单", [][]string{ + {"日期", "工单编号", "处理结果"}, + {"2026-06-18", "GD-001", "已派单"}, + }) + writeWorkbook(t, templatePath, "工单", [][]string{{"{{工单编号}}", "{{处理结果}}"}}) + writeJSON(t, configPath, map[string]any{ + "data": map[string]any{ + "type": "excel", + "path": dataPath, + "sheet": "工单", + }, + "filter": map[string]any{ + "equals": map[string]any{ + "日期": "{{date}}", + "工单编号": "{{ticket_no}}", + }, + "expect": "one", + }, + "template": map[string]any{ + "path": templatePath, + }, + "output": map[string]any{ + "path": filepath.Join(dir, "out", "工单_{{工单编号}}.xlsx"), + }, + }) + + err := RunWithOptionsError(configPath, RunOptions{Vars: map[string]string{ + "date": "2026-06-18", + "ticket_no": "GD-999", + }}) + assertAppErrorCode(t, err, ErrorCode("DATA_FILTER_NO_MATCH")) +} + +func TestRunFilterFailsWhenOneRowExpectedButManyMatch(t *testing.T) { + dir := t.TempDir() + dataPath := filepath.Join(dir, "tickets.xlsx") + templatePath := filepath.Join(dir, "template.xlsx") + configPath := filepath.Join(dir, "task.json") + + writeWorkbook(t, dataPath, "工单", [][]string{ + {"日期", "工单编号", "处理结果"}, + {"2026-06-18", "GD-001", "已派单"}, + {"2026-06-18", "GD-002", "已完成"}, + }) + writeWorkbook(t, templatePath, "工单", [][]string{{"{{工单编号}}", "{{处理结果}}"}}) + writeJSON(t, configPath, map[string]any{ + "data": map[string]any{ + "type": "excel", + "path": dataPath, + "sheet": "工单", + }, + "filter": map[string]any{ + "equals": map[string]any{ + "日期": "{{date}}", + }, + "expect": "one", + }, + "template": map[string]any{ + "path": templatePath, + }, + "output": map[string]any{ + "path": filepath.Join(dir, "out", "工单_{{工单编号}}.xlsx"), + }, + }) + + err := RunWithOptionsError(configPath, RunOptions{Vars: map[string]string{"date": "2026-06-18"}}) + assertAppErrorCode(t, err, ErrorCode("DATA_FILTER_MULTI_MATCH")) +} + +func TestRunFilterFailsWhenFieldIsMissing(t *testing.T) { + dir := t.TempDir() + dataPath := filepath.Join(dir, "tickets.xlsx") + templatePath := filepath.Join(dir, "template.xlsx") + configPath := filepath.Join(dir, "task.json") + + writeWorkbook(t, dataPath, "工单", [][]string{ + {"日期", "处理结果"}, + {"2026-06-18", "已派单"}, + }) + writeWorkbook(t, templatePath, "工单", [][]string{{"{{处理结果}}"}}) + writeJSON(t, configPath, map[string]any{ + "data": map[string]any{ + "type": "excel", + "path": dataPath, + "sheet": "工单", + }, + "filter": map[string]any{ + "equals": map[string]any{ + "工单编号": "{{ticket_no}}", + }, + }, + "template": map[string]any{ + "path": templatePath, + }, + "output": map[string]any{ + "path": filepath.Join(dir, "out", "工单.xlsx"), + }, + }) + + err := RunWithOptionsError(configPath, RunOptions{Vars: map[string]string{"ticket_no": "GD-001"}}) + assertAppErrorCode(t, err, ErrorCode("DATA_FILTER_FIELD")) +} + +func TestRunFilterFailsWhenVariableIsMissing(t *testing.T) { + dir := t.TempDir() + dataPath := filepath.Join(dir, "tickets.xlsx") + templatePath := filepath.Join(dir, "template.xlsx") + configPath := filepath.Join(dir, "task.json") + + writeWorkbook(t, dataPath, "工单", [][]string{ + {"日期", "工单编号", "处理结果"}, + {"2026-06-18", "GD-001", "已派单"}, + }) + writeWorkbook(t, templatePath, "工单", [][]string{{"{{工单编号}}", "{{处理结果}}"}}) + writeJSON(t, configPath, map[string]any{ + "data": map[string]any{ + "type": "excel", + "path": dataPath, + "sheet": "工单", + }, + "filter": map[string]any{ + "equals": map[string]any{ + "工单编号": "{{ticket_no}}", + }, + }, + "template": map[string]any{ + "path": templatePath, + }, + "output": map[string]any{ + "path": filepath.Join(dir, "out", "工单_{{工单编号}}.xlsx"), + }, + }) + + err := RunWithOptionsError(configPath, RunOptions{}) + assertAppErrorCode(t, err, ErrorCode("DATA_FILTER_VALUE")) +} + +func RunWithOptionsError(configPath string, opts RunOptions) error { + _, err := RunWithOptions(configPath, opts) + return err +} + +func assertAppErrorCode(t *testing.T, err error, want ErrorCode) { + t.Helper() + + if err == nil { + t.Fatalf("expected %s error, got nil", want) + } + var appErr *AppError + if !errors.As(err, &appErr) { + t.Fatalf("expected AppError, got %T: %v", err, err) + } + if appErr.Code != want { + t.Fatalf("error code = %s, want %s; error=%v", appErr.Code, want, err) + } +} + func seedP0SQLite(t *testing.T, path, statements string) { t.Helper() diff --git a/manual_tests/01_excel_to_word/daily_report_template.docx b/manual_tests/01_excel_to_word/daily_report_template.docx new file mode 100644 index 0000000000000000000000000000000000000000..3f6f1f60f4fcec9fb67a88ada9e53a42b7d084c3 GIT binary patch literal 36971 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 Lread^&e4AW!jDJe literal 0 HcmV?d00001 diff --git a/manual_tests/01_excel_to_word/out/daily_2026-06-18_李四_2.docx b/manual_tests/01_excel_to_word/out/daily_2026-06-18_李四_2.docx new file mode 100644 index 0000000000000000000000000000000000000000..fd5f06cdc2a0b71fa525e19f79b0faeb42d61e2f GIT binary patch literal 41899 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 Dxz zZxX5aB9U)dOGWN+^JDTfcSKfvBqjQ(RB=4V%0q)C$t5dy>cr<`?l-brF6Uq;>@M}0 zijEhjl>K9=x#7!%h?Yk%Hb*`5xx5K~_mZ`geB)J)nmIOdn$<8qh_4yBsyvaz@NY> zwAT)vFX^cHsqHXiyq|a4O>`@tZ*G3jW`C2T!___V=re1cA#q7~&*~bXmPDQ}zd{SI z`E&!12@OC8JUVDTLM9_~sBEjVE6L8Oz0Y--G}xlaDZM<0*BQv*%=f%~T(>GIBV2L0 z$#&NaO=et^Nj$JE^;^SGn;@2&b=~%FNwiUAiibTR+ zPDV6ut**%;ceg}b))JDkz9XF8i_YTOnnf2Dtt5CsYGTY!>c4f6SLi!5*}?$bvJnGx zwB2*DDWrOcD?>QDMF@*15AG{^cHS}$=3T;c%grgmLD*CEowsOgi9_-S{gC+s zXc>^sN{zoY3H|-ZyZ3ZvK^cnuA`g~`@fBmW=8PJFKUp!fP5Nlw)zjhSp<;Qve{@Vc zI(8r;i}yJFTKc9>s^gphYrhcOA7g|$4%d!@vsm7P+ve5mzFBX{ z-26_{@Om{&@?uxUm|YqUd#%Zsg*5+d%>J!duHL!& zv;Ew*fpW>Pq6qns+gVYt8sL-7wgPPCY2eyQ@srFc1N9NVSHfgFCp-}6#H+pvbOG{g z9_r!PgM;)6J_+ph5&62Iq6dd%PJ=xbyMnqOz|%H=U>$K_bjz1#s=DI^_f(b^uV(Sv z>n~S8vQ0Wv5_Br0MG1Lc#%u)TWa2p`2|v(%wV*}1h~{?Ew;vuP9oE3}m8?pvb!Osz z&}gwN6$X9|9Q8gSsn8lduy{3BmTOH9%w_r@^;BB87l+91*m+i{2&SVQ&Z4-amXOQK zPg^Y)X`oGaE>tmdUO2A$ElZU5ST{Wt_JZe05dZL+Bul4OJ!^2H=a^#HIq^}UG&x&3 zE11B8^@SE!9IWjddp+;N{AXPtA$4UJ<{K;lO$;#@|LQm=TiU)+gy9$(bZS#8ovG~f zc4Ig_cm$VD4a#tk!T)w7B@Oh3JwaACf3wuzn&=GW(5=(C7CYpA))JX8Dd{cz@bK0I zqwdOO{wFG5B&0~n@@>do$60z6KTVWUu40!UC*EmgSN;@+AeYJMdu3b~dk6S)bVjDD z=0|LYT$D%zwqm<=PpM?AS%xRVqjNk3vY_P)={czrpP7;p5pcB%7=GJtUY~hwTCTWb zoz?e?*}iV} z)TjDZffhx`%9r|*AZ20fk)q=&dYD2|qd7qDD<-SGiC-DfOy#mBprS6Hjrsby+M_{yT2)Ah$B zck4|EzMEP&i9`Abh0;pH_3vx0`K{*KIWCW8EYDU#n|$l9g);kao62>;^5{Hj1{a`> zofcrM1>}1}yO$E0-Vl3k^XzRgCCHG0f>zr#i?LF-beGwzeN{-O$3pgvrX+?om+95= z=YD@fvliMA%w+( z$rhb=O!4|VW$QKik!Q+sQJTVc6AT^3_-L;rH&7CDF$OGeZ)bXi-k&-aj`4{zmvEb8 z9MrhisU#VoF>TJbTQ|c`5kI?RKHSFA&hMnx9p+nf{p!zIhY2M#qmtHc*`r1F7m0xd zVJ%&nwLh(K>_-wG7-6p_sj7%NL6`&Fy!!A( z(#^zsCoXL-e7R9ZtgRN82hTloE@}B=pNj}uG{@Jan-tgt8Psj%r5plPD4O7@$8VwE ztM)Tl!|k!$Y;vD%OQsSlg-;#ce*Ii9GaWCew^#-xpbINH zu@$eUPDG#X>dLlfi$H#+9B}2Re*4-=EDdJ5Vy+3cJsLxXQ)(LmJV_pJ0}6`)4b&YA z!0Bo*f@Ew517W(J|z) zM@05KoP;G^>86os0}-Uo_gio1NNm{hx8!lEORn%EmsIaL$?kW?B8&$EZ>Y%-zREJq ziKhWVBtN>vf}41Ok^Lw)DPjzdfgd32ILBBqi{|Phh=<};2ZfOaQj{25TqQz# zV!o=4%-CSW9JF4OgcJ-(NG2Iw%x4nLH@Vaof2a`iTn-{trq6Bkx&)aVAta!8x6ww7 z?FCwf$wb1O6HYE_O|So?izAul9A~W01g=do$=*VNCxwRSwo>WLP{I9$@nPi~cfbCG z?qIUO)Mmxkbr8zd46cKZ2kDkV7nQAAm|72`X;j>0T@%%Z7Zdgms4Psw_kf{BKSN;{ z&G}MVb~6M<)a=Jv!MBxo;H#PQ8pZ{?5A&TWG*CN0EgX$WjJd;q{8MT->UUN3Hpeg? z;{9p^6##(${IX?%K}c_C;4ecqZ{-6o5TiL4O5zYB2$It0GVN!9joq;DQrV~>Ot6*^ zm8|4B+24Inr2Vz#xj}v9eE)d?HGHY-(wNRN|AbZ4k=cV4<-K}PA_^Sy>nCB{6s`kjoYf5f#Xn*ed|Jqnbf{8nLUs3 z)AG_0$&dF6Xh#lWVfLotky1+lBAag3kJ|L)26i00^Op%v+(}Fxh6q~95X7N&oFcbx z?Z3|#I21%r8mf5kcU!&ZdF)tZ>QrcioNv);m`C5#75rK>~DC=~7_{^tvShy<6b5A2Ys<}<`!Pi{D{&tWYy_p)pA@7W@?Dg_e z3QP9I>jgMMgUux1>u?M9<85@Ze0=*u~AGc(b1P9An(Pn+V zwk5=@g-oArG2R~(SWR_Wxh+mVY*m@iC2qDSo(K$hJZq?D@x>qZM;?`|t*s=6(H$N+ zR6G8BRjYm5;!@K>)HxyeQPP{d!Hc(*{NHr= zbb6$Yw0qb+51Rv9qsEUlw*_}IHYS6E+#SEHqB)gvjp*`Pc8?{8Z5(?uafIg16Zuoc zPSaX!@y~0;()p>K z4bwPFw+8_@f&K<>?WZbv912%0QdXIMzr< z&L9$BEs#t+FwIp3aJMW}5|dY=Gjp5;~-oNEv`V(Oe}*t~*Q0-whA5WPYY% z&d7dONN#c)TL)elba<6e;IEDWQ13udkzePcj8@-nF-p~_-ghW5l6PE5lF%Inq9dSX z>E&r!;$+RDH}x|W{%I70+% zyP(gdV+Ss8L;`+ql+=NnS`r8VaN`@j{MRV>wZXc;;kSPcg9j#~zW4|5(`-SG1_m@2 zm5DJhfxLT9e>LJD5`r_HAEMpD_S#$4S&e=0~EG?tf^1|;hy7+pfyQ3-_ zt2$>9x2TAU%zGA+)s@Q|og1LFz@E0CeCUe_2&H=~Q`3#Y1p-zPm$8Cg}2+Fk`a;UFFW>5Y|eGj676X!$0zZxLPd`ZEnbLsNyP5sFC5gW{n zCq^||0g^-J4eAfa;CsiGN+{J_k_mF9GP=cVdW5qVD`ldgmRY%s_%VB5pn(6#&+7E2 zqhX{Hdv6!z?{eX$Z)Os$bIAy$Y>j;yCBc14Gnkk#FjKq*{`Qh>;{i&yN=)^r zPQnDa`DEH}4E%az@7(!&l@fYH>DnP^;cbp<&(573mEZa0WiKdwhUfJMo@183`2A}w z{gdTC*Hu%x67^j%%J_QPPXKA-Y7Jt2dut&P8sc3ZTH4+^@@CO^V48f8^K;bosObF0Zt#7 zWkiFKA$k?bD08S;H@r+%_kq$65p;gRr9sn>8O-oFgq0rw4p`UW|gBmJO( z_P-X=vrGfSZZR5scTfnQh_LnJN>(Qddq1G75lhW^ribm=tfb+L?qgc|c!OHR!YeE) zw{{^F)UZ~xKb-|O3BN*ML1O3v=0?<^x#Vmy!=X=ijXUWOPX+E|txrm# z1K`z&FGyB{Zw8M#Tx=8{bp7F_%UmX{OFPxuxz3UG^=4IT;5#P|ZV_waTCrQ8R?xZBHLwKBI)mti-rjf5!f} z)5rLebz}$Bwe?1&@fFUHCF*m^M-_)CJd;3zD}?_$62sH^=PMe|@Ba_TE}}1{QGa0p zfM{U%KhgirrY^!S<~4uA7x91pU(%b41upva{}hPf!aI0;f&c2>FIKtePySN{7>Xap zzqyr*(2IlnZ|EcH-^Tbw;Kf1sH!v1I7ys|h|2-Bjf-kE4Z}1X6*2IJVhvqNVxhSN+ e>-6KZ#s4BJV?APgyaoV};or)?63Acj1N;lZG;BHm literal 0 HcmV?d00001 diff --git a/manual_tests/01_excel_to_word/task.json b/manual_tests/01_excel_to_word/task.json new file mode 100644 index 0000000..b955da5 --- /dev/null +++ b/manual_tests/01_excel_to_word/task.json @@ -0,0 +1,19 @@ +{ + "vars": { + "date": "2026-06-18", + "batch": "默认班次" + }, + "data": { + "type": "excel", + "path": "./source_daily_data.xlsx", + "sheet": "Daily", + "header_row": 1 + }, + "template": { + "path": "./daily_report_template.docx" + }, + "output": { + "path": "./out/daily_{{date}}_{{name}}_{{_row}}.docx", + "overwrite": true + } +} \ No newline at end of file diff --git a/manual_tests/02_sqlite_to_excel/department_summary_template.xlsx b/manual_tests/02_sqlite_to_excel/department_summary_template.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..c2b029f3b887966746d616feb8d1f1a6b750b9ed GIT binary patch literal 5299 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 u7RC+UfJ2vrG)Q-+f*>8z-8s}BukU^J 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 literal 0 HcmV?d00001 diff --git a/manual_tests/02_sqlite_to_excel/source_summary.db b/manual_tests/02_sqlite_to_excel/source_summary.db new file mode 100644 index 0000000000000000000000000000000000000000..38362de82c4c2259d0dae2dd44f0de31388b8701 GIT binary patch literal 8192 zcmeI#KTE?v7zXgWtEea%2SGY{byBd>RHz+|(yfcyy)!`0cpg@atewrzm=vA;B<4Ut00Izz00bZa0SG_<0uX=z1V$uqGEFBIY@0S6 zEed5>log@0D?OdB)?8PpdU%Cx?`E7_hUc8EY=(#5^W`c2uYN*Y%VWJ73Mg6emChH1 z*?kXAXkUwRe&4TonwLB+52Xr^5d|;Ux)06yN1jx@5B>R*m0)ikv95{rX1$n(f&c^{ z009U<00Izz00bZa0SG`~bON!+_+pIG=*Q(l_o~rtJ|+{%R6LQ2+Z$EZe!Y8tK3!ra h!Ujdsq!Ibfa2kx6jJBWdJ2&UQ$E35J+lzLq^#v7GfKdPd literal 0 HcmV?d00001 diff --git a/manual_tests/02_sqlite_to_excel/task.json b/manual_tests/02_sqlite_to_excel/task.json new file mode 100644 index 0000000..0564aa7 --- /dev/null +++ b/manual_tests/02_sqlite_to_excel/task.json @@ -0,0 +1,20 @@ +{ + "vars": { + "date": "2026-06-18" + }, + "data": { + "type": "sqlite", + "path": "./source_summary.db", + "query": "select department, report_date, total_count, abnormal_count, owner from department_summary where report_date = ? order by department", + "params": [ + "{{date}}" + ] + }, + "template": { + "path": "./department_summary_template.xlsx" + }, + "output": { + "path": "./out/summary_{{department}}_{{_row}}.xlsx", + "overwrite": true + } +} \ No newline at end of file diff --git a/manual_tests/03_excel_to_excel/audit_template.xlsx b/manual_tests/03_excel_to_excel/audit_template.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..178c0640fc101db74a115f4faaec9e5e4a941d44 GIT binary patch literal 5289 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 literal 0 HcmV?d00001 diff --git a/manual_tests/03_excel_to_excel/out/audit_2026-06-18_王五_1.xlsx b/manual_tests/03_excel_to_excel/out/audit_2026-06-18_王五_1.xlsx new file mode 100755 index 0000000000000000000000000000000000000000..1897d2ddca4e47c1c6ce9c0b8893dd50fa9eb22b GIT binary patch literal 7112 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 V;iVe_0v7yu1y3IQ@RWjp@PA;3LNx#Y literal 0 HcmV?d00001 diff --git a/manual_tests/03_excel_to_excel/out/audit_2026-06-18_赵六_2.xlsx b/manual_tests/03_excel_to_excel/out/audit_2026-06-18_赵六_2.xlsx new file mode 100755 index 0000000000000000000000000000000000000000..b89752ba51db9728c6911ba608608d3537dfa129 GIT binary patch literal 7121 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 literal 0 HcmV?d00001 diff --git a/manual_tests/03_excel_to_excel/source_audit_data.xlsx b/manual_tests/03_excel_to_excel/source_audit_data.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..180ab5f219b0165e3cab903a77e6cc51d86feb41 GIT binary patch literal 5378 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 literal 0 HcmV?d00001 diff --git a/manual_tests/03_excel_to_excel/task.json b/manual_tests/03_excel_to_excel/task.json new file mode 100644 index 0000000..75e8fd7 --- /dev/null +++ b/manual_tests/03_excel_to_excel/task.json @@ -0,0 +1,18 @@ +{ + "vars": { + "date": "2026-06-18" + }, + "data": { + "type": "excel", + "path": "./source_audit_data.xlsx", + "sheet": "Audit", + "header_row": 2 + }, + "template": { + "path": "./audit_template.xlsx" + }, + "output": { + "path": "./out/audit_{{date}}_{{employee}}_{{_row}}.xlsx", + "overwrite": true + } +} \ No newline at end of file diff --git a/manual_tests/04_filter_work_order_to_word/out/work_order_2026-06-18_GD-002.docx b/manual_tests/04_filter_work_order_to_word/out/work_order_2026-06-18_GD-002.docx new file mode 100644 index 0000000000000000000000000000000000000000..f8954c43a0dcdfea89a5c765074c0da19beb392f GIT binary patch literal 41819 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 TV2;}#%G97OU?{32?{EDF>1`Vt literal 0 HcmV?d00001 diff --git a/manual_tests/04_filter_work_order_to_word/source_work_orders.xlsx b/manual_tests/04_filter_work_order_to_word/source_work_orders.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..3d7777ba2a9f8d9550026f303098db4b2c78810e GIT binary patch literal 5476 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 XG}Um>=^6llkA6#|$2sY5`2qe1Plb6Z literal 0 HcmV?d00001 diff --git a/manual_tests/04_filter_work_order_to_word/task.json b/manual_tests/04_filter_work_order_to_word/task.json new file mode 100644 index 0000000..d623e8c --- /dev/null +++ b/manual_tests/04_filter_work_order_to_word/task.json @@ -0,0 +1,25 @@ +{ + "vars": { + "date": "2026-06-18" + }, + "data": { + "type": "excel", + "path": "./source_work_orders.xlsx", + "sheet": "工单", + "header_row": 1 + }, + "filter": { + "equals": { + "日期": "{{date}}", + "工单编号": "{{ticket_no}}" + }, + "expect": "one" + }, + "template": { + "path": "./work_order_template.docx" + }, + "output": { + "path": "./out/work_order_{{日期}}_{{工单编号}}.docx", + "overwrite": true + } +} \ No newline at end of file diff --git a/manual_tests/04_filter_work_order_to_word/work_order_template.docx b/manual_tests/04_filter_work_order_to_word/work_order_template.docx new file mode 100644 index 0000000000000000000000000000000000000000..7f0507010845470e03a9d483f723df1d140e84f5 GIT binary patch literal 36945 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 None: + if OUT.exists(): + shutil.rmtree(OUT) + OUT.mkdir(parents=True) + + build_excel_to_word(OUT / "01_excel_to_word") + build_sqlite_to_excel(OUT / "02_sqlite_to_excel") + build_excel_to_excel(OUT / "03_excel_to_excel") + build_filter_work_order_to_word(OUT / "04_filter_work_order_to_word") + write_readme() + + print(OUT) + + +def build_excel_to_word(path: Path) -> None: + path.mkdir(parents=True) + write_daily_source_xlsx(path / "source_daily_data.xlsx") + write_daily_word_template(path / "daily_report_template.docx") + write_json( + path / "task.json", + { + "vars": {"date": "2026-06-18", "batch": "默认班次"}, + "data": { + "type": "excel", + "path": "./source_daily_data.xlsx", + "sheet": "Daily", + "header_row": 1, + }, + "template": {"path": "./daily_report_template.docx"}, + "output": { + "path": "./out/daily_{{date}}_{{name}}_{{_row}}.docx", + "overwrite": True, + }, + }, + ) + + +def build_sqlite_to_excel(path: Path) -> None: + path.mkdir(parents=True) + write_summary_sqlite(path / "source_summary.db") + write_summary_excel_template(path / "department_summary_template.xlsx") + write_json( + path / "task.json", + { + "vars": {"date": "2026-06-18"}, + "data": { + "type": "sqlite", + "path": "./source_summary.db", + "query": "select department, report_date, total_count, abnormal_count, owner from department_summary where report_date = ? order by department", + "params": ["{{date}}"], + }, + "template": {"path": "./department_summary_template.xlsx"}, + "output": { + "path": "./out/summary_{{department}}_{{_row}}.xlsx", + "overwrite": True, + }, + }, + ) + + +def build_excel_to_excel(path: Path) -> None: + path.mkdir(parents=True) + write_audit_source_xlsx(path / "source_audit_data.xlsx") + write_audit_excel_template(path / "audit_template.xlsx") + write_json( + path / "task.json", + { + "vars": {"date": "2026-06-18"}, + "data": { + "type": "excel", + "path": "./source_audit_data.xlsx", + "sheet": "Audit", + "header_row": 2, + }, + "template": {"path": "./audit_template.xlsx"}, + "output": { + "path": "./out/audit_{{date}}_{{employee}}_{{_row}}.xlsx", + "overwrite": True, + }, + }, + ) + + +def build_filter_work_order_to_word(path: Path) -> None: + path.mkdir(parents=True) + write_work_order_source_xlsx(path / "source_work_orders.xlsx") + write_work_order_word_template(path / "work_order_template.docx") + write_json( + path / "task.json", + { + "vars": {"date": "2026-06-18"}, + "data": { + "type": "excel", + "path": "./source_work_orders.xlsx", + "sheet": "工单", + "header_row": 1, + }, + "filter": { + "equals": { + "日期": "{{date}}", + "工单编号": "{{ticket_no}}", + }, + "expect": "one", + }, + "template": {"path": "./work_order_template.docx"}, + "output": { + "path": "./out/work_order_{{日期}}_{{工单编号}}.docx", + "overwrite": True, + }, + }, + ) + + +def write_daily_source_xlsx(path: Path) -> None: + rows = [ + ["name", "department", "done", "plan", "risk"], + ["张三/测试", "营销部", "完成 A 系统订单核对 128 条;同步 B 系统回款 35 笔", "跟进 3 条异常订单并补充截图", "无"], + ["李四", "客服部", "整理投诉工单 21 条;完成日报提交", "复核高优先级工单并同步主管", "等待业务确认 1 条"], + ] + write_table_workbook(path, "Daily", rows, title="日报源数据") + + +def write_daily_word_template(path: Path) -> None: + doc = Document() + section = doc.sections[0] + section.top_margin = Inches(0.8) + section.bottom_margin = Inches(0.8) + section.left_margin = Inches(0.85) + section.right_margin = Inches(0.85) + + title = doc.add_paragraph() + title_run = title.add_run("员工日报(测试模板)") + title_run.bold = True + title_run.font.size = Pt(18) + + meta = doc.add_table(rows=4, cols=2) + meta.alignment = WD_TABLE_ALIGNMENT.LEFT + set_table_style(meta) + labels = ["日期", "员工", "部门", "班次"] + values = ["{{date}}", "{{na", "{{department}}", "{{batch}}"] + for i, label in enumerate(labels): + meta.cell(i, 0).text = label + if label == "员工": + p = meta.cell(i, 1).paragraphs[0] + p.add_run(values[i]) + p.add_run("me}}") + else: + meta.cell(i, 1).text = values[i] + + for heading, placeholder in [ + ("今日完成", "{{done}}"), + ("明日计划", "{{plan}}"), + ("风险备注", "{{risk}}"), + ]: + doc.add_paragraph() + h = doc.add_paragraph() + r = h.add_run(heading) + r.bold = True + r.font.size = Pt(12) + p = doc.add_paragraph() + p.add_run(placeholder) + + doc.save(path) + + +def write_summary_sqlite(path: Path) -> None: + conn = sqlite3.connect(path) + try: + conn.executescript( + """ + create table department_summary ( + department text, + report_date text, + total_count integer, + abnormal_count integer, + owner text + ); + insert into department_summary values + ('客服部', '2026-06-18', 76, 0, '李四'), + ('营销部', '2026-06-18', 128, 3, '张三'), + ('营销部', '2026-06-17', 115, 2, '张三'); + """ + ) + conn.commit() + finally: + conn.close() + + +def write_summary_excel_template(path: Path) -> None: + wb = Workbook() + ws = wb.active + ws.title = "Summary" + ws.append(["部门日报汇总(测试模板)", ""]) + ws.append(["部门", "{{department}}"]) + ws.append(["日期", "{{report_date}}"]) + ws.append(["负责人", "{{owner}}"]) + ws.append(["处理总数", "{{total_count}}"]) + ws.append(["异常数", "{{abnormal_count}}"]) + style_sheet(ws, title_rows={1}) + ws.column_dimensions["A"].width = 18 + ws.column_dimensions["B"].width = 32 + wb.save(path) + + +def write_audit_source_xlsx(path: Path) -> None: + rows = [ + ["日报质检导出"], + ["employee", "date", "item", "score", "comment"], + ["王五", "2026-06-18", "日报完整性", "92", "字段齐全,说明清楚"], + ["赵六", "2026-06-18", "系统截图一致性", "87", "缺少 1 张截图,需要补充"], + ] + write_table_workbook(path, "Audit", rows, title=None) + + +def write_audit_excel_template(path: Path) -> None: + wb = Workbook() + ws = wb.active + ws.title = "AuditReport" + ws.append(["日报质检结果(测试模板)", ""]) + ws.append(["日期", "{{date}}"]) + ws.append(["员工", "{{employee}}"]) + ws.append(["检查项", "{{item}}"]) + ws.append(["得分", "{{score}}"]) + ws.append(["评语", "{{comment}}"]) + style_sheet(ws, title_rows={1}) + ws.column_dimensions["A"].width = 16 + ws.column_dimensions["B"].width = 42 + wb.save(path) + + +def write_work_order_source_xlsx(path: Path) -> None: + rows = [ + ["日期", "工单编号", "客户名称", "系统来源", "处理结果", "下一步"], + ["2026-06-18", "GD-001", "A 公司", "PMS3.0", "已派单", "等待现场反馈"], + ["2026-06-18", "GD-002", "B 公司", "D5000", "已完成", "归档并同步日报"], + ["2026-06-19", "GD-001", "C 公司", "风控平台", "待复核", "补充截图"], + ] + write_table_workbook(path, "工单", rows, title="工单源数据") + + +def write_work_order_word_template(path: Path) -> None: + doc = Document() + section = doc.sections[0] + section.top_margin = Inches(0.8) + section.bottom_margin = Inches(0.8) + section.left_margin = Inches(0.85) + section.right_margin = Inches(0.85) + + title = doc.add_paragraph() + title_run = title.add_run("工单处理记录(筛选测试模板)") + title_run.bold = True + title_run.font.size = Pt(18) + + table = doc.add_table(rows=6, cols=2) + table.alignment = WD_TABLE_ALIGNMENT.LEFT + set_table_style(table) + rows = [ + ("日期", "{{日期}}"), + ("工单编号", "{{工单编号}}"), + ("客户名称", "{{客户名称}}"), + ("系统来源", "{{系统来源}}"), + ("处理结果", "{{处理结果}}"), + ("下一步", "{{下一步}}"), + ] + for idx, (label, value) in enumerate(rows): + table.cell(idx, 0).text = label + table.cell(idx, 1).text = value + + doc.save(path) + + +def write_table_workbook(path: Path, sheet: str, rows: list[list[str]], title: str | None) -> None: + wb = Workbook() + ws = wb.active + ws.title = sheet + for row in rows: + ws.append(row) + title_rows = {1} if title else set() + style_sheet(ws, title_rows=title_rows) + for idx, width in enumerate([18, 16, 44, 36, 28], start=1): + ws.column_dimensions[get_column_letter(idx)].width = width + wb.save(path) + + +def style_sheet(ws, title_rows: set[int]) -> None: + header_fill = PatternFill("solid", fgColor="D9EAF7") + title_fill = PatternFill("solid", fgColor="1F4E79") + thin = Side(style="thin", color="D9E2F3") + border = Border(top=thin, left=thin, right=thin, bottom=thin) + for row in ws.iter_rows(): + for cell in row: + cell.alignment = Alignment(vertical="center", wrap_text=True) + cell.border = border + if cell.row in title_rows: + cell.font = Font(bold=True, color="FFFFFF", size=13) + cell.fill = title_fill + elif cell.row == min(title_rows or {1}) + 1 or (not title_rows and cell.row == 1): + cell.font = Font(bold=True) + cell.fill = header_fill + ws.freeze_panes = "A2" + + +def set_table_style(table) -> None: + for row in table.rows: + for cell in row.cells: + cell.vertical_alignment = WD_CELL_VERTICAL_ALIGNMENT.CENTER + for paragraph in cell.paragraphs: + for run in paragraph.runs: + run.font.size = Pt(10.5) + + +def write_json(path: Path, data: dict) -> None: + path.write_text(json.dumps(data, ensure_ascii=False, indent=2), encoding="utf-8") + + +def write_readme() -> None: + text = """# docfill 手工测试素材 + +本目录提供四组可直接运行的本地测试素材,用于验证 `docfill` 对筛选、Word、Excel、Excel 数据源和 SQLite 数据源的支持情况。 + +运行前进入项目根目录: + +```bash +cd /Users/zhaoyilun/Documents/xls_doc +``` + +构建工具: + +```bash +bash scripts/build.sh +``` + +## 案例 1:Excel 数据生成 Word 日报 + +目录: + +```text +manual_tests/01_excel_to_word +``` + +运行命令: + +```bash +dist/docfill-darwin-arm64 run -c manual_tests/01_excel_to_word/task.json --var batch=早班 --verbose +``` + +输出示例: + +```text +generated 2 file(s) +- /Users/zhaoyilun/Documents/xls_doc/manual_tests/01_excel_to_word/out/daily_2026-06-18_张三_测试_1.docx +- /Users/zhaoyilun/Documents/xls_doc/manual_tests/01_excel_to_word/out/daily_2026-06-18_李四_2.docx +``` + +## 案例 2:SQLite 数据生成 Excel 汇总表 + +目录: + +```text +manual_tests/02_sqlite_to_excel +``` + +运行命令: + +```bash +dist/docfill-darwin-arm64 run -c manual_tests/02_sqlite_to_excel/task.json --var date=2026-06-18 --verbose +``` + +输出示例: + +```text +generated 2 file(s) +- /Users/zhaoyilun/Documents/xls_doc/manual_tests/02_sqlite_to_excel/out/summary_客服部_1.xlsx +- /Users/zhaoyilun/Documents/xls_doc/manual_tests/02_sqlite_to_excel/out/summary_营销部_2.xlsx +``` + +## 案例 3:Excel 数据生成 Excel 质检表 + +目录: + +```text +manual_tests/03_excel_to_excel +``` + +运行命令: + +```bash +dist/docfill-darwin-arm64 run -c manual_tests/03_excel_to_excel/task.json --var date=2026-06-18 --verbose +``` + +输出示例: + +```text +generated 2 file(s) +- /Users/zhaoyilun/Documents/xls_doc/manual_tests/03_excel_to_excel/out/audit_2026-06-18_王五_1.xlsx +- /Users/zhaoyilun/Documents/xls_doc/manual_tests/03_excel_to_excel/out/audit_2026-06-18_赵六_2.xlsx +``` + +## 案例 4:按日期和工单编号筛选一条工单并生成 Word + +目录: + +```text +manual_tests/04_filter_work_order_to_word +``` + +输入数据内容: + +```text +日期 工单编号 客户名称 系统来源 处理结果 下一步 +2026-06-18 GD-001 A 公司 PMS3.0 已派单 等待现场反馈 +2026-06-18 GD-002 B 公司 D5000 已完成 归档并同步日报 +2026-06-19 GD-001 C 公司 风控平台 待复核 补充截图 +``` + +运行命令: + +```bash +dist/docfill-darwin-arm64 run -c manual_tests/04_filter_work_order_to_word/task.json --var date=2026-06-18 --var ticket_no=GD-002 --verbose +``` + +输出示例: + +```text +generated 1 file(s) +- /Users/zhaoyilun/Documents/xls_doc/manual_tests/04_filter_work_order_to_word/out/work_order_2026-06-18_GD-002.docx +``` + +查看结果: + +```bash +open manual_tests/04_filter_work_order_to_word/out +``` + +## 重新生成素材 + +如需重新生成全部手工测试文件,执行: + +```bash +/Users/zhaoyilun/.cache/codex-runtimes/codex-primary-runtime/dependencies/python/bin/python3 scripts/make-manual-test-materials.py +``` + +输出示例: + +```text +/Users/zhaoyilun/Documents/xls_doc/manual_tests +``` +""" + (OUT / "README.md").write_text(text, encoding="utf-8") + + +if __name__ == "__main__": + main() diff --git a/scripts/smoke-fixtures/main.go b/scripts/smoke-fixtures/main.go index c2aa8cd..1762084 100644 --- a/scripts/smoke-fixtures/main.go +++ b/scripts/smoke-fixtures/main.go @@ -25,6 +25,10 @@ func main() { fmt.Fprintf(os.Stderr, "write excel-to-word fixtures: %v\n", err) os.Exit(1) } + if err := writeExcelFilterToWord(filepath.Join(*base, "excel-filter-to-word")); err != nil { + fmt.Fprintf(os.Stderr, "write excel-filter-to-word fixtures: %v\n", err) + os.Exit(1) + } if err := writeSQLiteToExcel(filepath.Join(*base, "sqlite-to-excel")); err != nil { fmt.Fprintf(os.Stderr, "write sqlite-to-excel fixtures: %v\n", err) os.Exit(1) @@ -45,6 +49,21 @@ func writeExcelToWord(dir string) error { return writeDocx(filepath.Join(dir, "template.docx"), `员工:{{name}}日期:{{date}}完成:{{done}}计划:{{plan}}`) } +func writeExcelFilterToWord(dir string) error { + if err := os.MkdirAll(dir, 0o755); err != nil { + return err + } + if err := writeWorkbook(filepath.Join(dir, "data.xlsx"), "Tickets", [][]string{ + {"date", "ticket_no", "customer", "result"}, + {"2026-06-18", "GD-001", "A 公司", "已派单"}, + {"2026-06-18", "GD-002", "B 公司", "已完成"}, + {"2026-06-19", "GD-001", "C 公司", "待复核"}, + }); err != nil { + return err + } + return writeDocx(filepath.Join(dir, "template.docx"), `工单:{{ticket_no}}日期:{{date}}客户:{{customer}}结果:{{result}}`) +} + func writeSQLiteToExcel(dir string) error { if err := os.MkdirAll(dir, 0o755); err != nil { return err diff --git a/scripts/smoke.sh b/scripts/smoke.sh index 7ac00c4..5837ea0 100755 --- a/scripts/smoke.sh +++ b/scripts/smoke.sh @@ -17,10 +17,13 @@ cp -R examples "$TMP/examples" go run ./scripts/smoke-fixtures --base "$TMP/examples" "$TMP/docfill" run -c "$TMP/examples/excel-to-word/task.json" --var date=2026-06-18 +"$TMP/docfill" run -c "$TMP/examples/excel-filter-to-word/task.json" --var date=2026-06-18 --var ticket_no=GD-002 "$TMP/docfill" run -c "$TMP/examples/sqlite-to-excel/task.json" --var date=2026-06-18 test -f "$TMP/examples/excel-to-word/out/daily_2026-06-18_张三_1.docx" test -f "$TMP/examples/excel-to-word/out/daily_2026-06-18_李四_2.docx" +test -f "$TMP/examples/excel-filter-to-word/out/ticket_2026-06-18_GD-002.docx" +test ! -f "$TMP/examples/excel-filter-to-word/out/ticket_2026-06-18_GD-001.docx" xlsx_count="$(find "$TMP/examples/sqlite-to-excel/out" -type f -name '*.xlsx' | wc -l | tr -d ' ')" if [[ "$xlsx_count" != "2" ]]; then

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 AF8}}l literal 0 HcmV?d00001 diff --git a/manual_tests/README.md b/manual_tests/README.md new file mode 100644 index 0000000..32ce752 --- /dev/null +++ b/manual_tests/README.md @@ -0,0 +1,131 @@ +# docfill 手工测试素材 + +本目录提供四组可直接运行的本地测试素材,用于验证 `docfill` 对筛选、Word、Excel、Excel 数据源和 SQLite 数据源的支持情况。 + +运行前进入项目根目录: + +```bash +cd /Users/zhaoyilun/Documents/xls_doc +``` + +构建工具: + +```bash +bash scripts/build.sh +``` + +## 案例 1:Excel 数据生成 Word 日报 + +目录: + +```text +manual_tests/01_excel_to_word +``` + +运行命令: + +```bash +dist/docfill-darwin-arm64 run -c manual_tests/01_excel_to_word/task.json --var batch=早班 --verbose +``` + +输出示例: + +```text +generated 2 file(s) +- /Users/zhaoyilun/Documents/xls_doc/manual_tests/01_excel_to_word/out/daily_2026-06-18_张三_测试_1.docx +- /Users/zhaoyilun/Documents/xls_doc/manual_tests/01_excel_to_word/out/daily_2026-06-18_李四_2.docx +``` + +## 案例 2:SQLite 数据生成 Excel 汇总表 + +目录: + +```text +manual_tests/02_sqlite_to_excel +``` + +运行命令: + +```bash +dist/docfill-darwin-arm64 run -c manual_tests/02_sqlite_to_excel/task.json --var date=2026-06-18 --verbose +``` + +输出示例: + +```text +generated 2 file(s) +- /Users/zhaoyilun/Documents/xls_doc/manual_tests/02_sqlite_to_excel/out/summary_客服部_1.xlsx +- /Users/zhaoyilun/Documents/xls_doc/manual_tests/02_sqlite_to_excel/out/summary_营销部_2.xlsx +``` + +## 案例 3:Excel 数据生成 Excel 质检表 + +目录: + +```text +manual_tests/03_excel_to_excel +``` + +运行命令: + +```bash +dist/docfill-darwin-arm64 run -c manual_tests/03_excel_to_excel/task.json --var date=2026-06-18 --verbose +``` + +输出示例: + +```text +generated 2 file(s) +- /Users/zhaoyilun/Documents/xls_doc/manual_tests/03_excel_to_excel/out/audit_2026-06-18_王五_1.xlsx +- /Users/zhaoyilun/Documents/xls_doc/manual_tests/03_excel_to_excel/out/audit_2026-06-18_赵六_2.xlsx +``` + +## 案例 4:按日期和工单编号筛选一条工单并生成 Word + +目录: + +```text +manual_tests/04_filter_work_order_to_word +``` + +输入数据内容: + +```text +日期 工单编号 客户名称 系统来源 处理结果 下一步 +2026-06-18 GD-001 A 公司 PMS3.0 已派单 等待现场反馈 +2026-06-18 GD-002 B 公司 D5000 已完成 归档并同步日报 +2026-06-19 GD-001 C 公司 风控平台 待复核 补充截图 +``` + +运行命令: + +```bash +dist/docfill-darwin-arm64 run -c manual_tests/04_filter_work_order_to_word/task.json --var date=2026-06-18 --var ticket_no=GD-002 --verbose +``` + +输出示例: + +```text +generated 1 file(s) +- /Users/zhaoyilun/Documents/xls_doc/manual_tests/04_filter_work_order_to_word/out/work_order_2026-06-18_GD-002.docx +``` + +查看结果: + +```bash +open manual_tests/04_filter_work_order_to_word/out +``` + +## 重新生成素材 + +如需重新生成全部手工测试文件,执行: + +```bash +/Users/zhaoyilun/.cache/codex-runtimes/codex-primary-runtime/dependencies/python/bin/python3 scripts/make-manual-test-materials.py +``` + +输出示例: + +```text +/Users/zhaoyilun/Documents/xls_doc/manual_tests +``` diff --git a/manual_tests/_evaluation_rendered/daily/page-1.png b/manual_tests/_evaluation_rendered/daily/page-1.png new file mode 100644 index 0000000000000000000000000000000000000000..9d721992e73c3cc7c0757400a6c7fd916d2ce8b6 GIT binary patch literal 84549 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%0AWT$7x@fuX-rFDqLr@G3^tcF}qKQkqk* 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 QPddz-r9U%Dch$cC1;OjA-v9sr literal 0 HcmV?d00001 diff --git a/manual_tests/_evaluation_rendered/filter/page-1.png b/manual_tests/_evaluation_rendered/filter/page-1.png new file mode 100644 index 0000000000000000000000000000000000000000..a5f857697bda1c8442fcd153967e403783d82809 GIT binary patch literal 67984 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