forked from erp-dev/erp
3.6 KiB
3.6 KiB
2026-01-26 工作记录
1) 实验性:DOCX 打印模板(.docx)占位符渲染与“剩余变量清空”
背景:
- 用户提供
.docx打印模板(示例:仓库根目录print-template.docx) - 模板变量格式为
#{...}/{...},且在 Word/WPS 中可能被拆分到多个 run(w:t)里 - 需求:将业务数据套版后,未命中的模板变量必须用空字符串清空,避免打印出原始变量文本
落地内容(实验性,可能废弃,需保留记录):
- 新增渲染工具:
printing/docx_template.pyrender_docx_template(...):单页 docx 的占位符替换/清空(支持跨 run 断裂)extract_docx_placeholders(...):从 docx 抽取占位符 key(document/header/footer)render_docx_template_pages(...):按页复制模板并逐页渲染(用于固定容量表格分页)
- 新增 mock 数据生成(用于“尽可能饱满”的套版验证,无需数据库):
printing/print_docx_services.pybuild_mock_sales_docx_pages(...):按模板“每页 9 行、每行 8 个销售数量格”生成多页 context- 每页汇总字段(按页计算):
#{打印-销售单(8*9).匹数}:本页非空“销售数量”格子数#{打印-销售单(8*9).总数量}:本页非空“销售数量”之和- 同时填充
#{...当前页码}/#{...总页数}
- 新增命令(便于本地/环境快速验证):
printing/management/commands/render_docx_template.py- 用法:
uv run python manage.py render_docx_template <template.docx> --out <out.docx> --context-json '{...}'
- 用法:
printing/management/commands/render_printing_order_docx.py- 从 DB 选取 PrintingOrder 渲染(当前环境无真实数据时会提示无法执行)
printing/management/commands/render_mock_docx.py- 用法(多页 mock):
uv run python manage.py render_mock_docx --pages 3 --out .tmp_docx/mock-rendered-3pages.docx
- 用法(多页 mock):
- 新增单测(锁住行为:不残留占位符、支持分页):
printing/test_docx_template.pyprinting/test_docx_pagination.pyprinting/test_docx_pagination.py(按页抽取w:t文本做断言,避免被 XML 标签分割干扰)
产物(示例输出):
.tmp_docx/mock-rendered-3pages.docx(多页 mock 套版产物,便于打开核对页码与汇总)
依赖:
python-docx(通过uv add python-docx引入;同时安装lxml)
2) 核对:明道云“开版暂存”同步(command / task / beat)
现状确认:
- command:
api_v1/management/commands/sync_mdy_plate_orders.py- 底层调用:
api_v1.mdy_plate_order_sync.sync_mdy_plate_orders_to_staging(...) - 支持参数:
--request-interval-seconds(用于限流,默认 0.02,约 50 qps 建议值) - 支持游标:
--use-checkpoint/--skip-checkpoint(DataSync)
- 底层调用:
- Celery task:
api_v1/tasks.py::sync_mdy_plate_orders- 已存在,但当前
flower/settings.py::CELERY_BEAT_SCHEDULE未配置该 task 的定时触发
- 已存在,但当前
待决策(需用户确认后再实施):
- 是否新增 Celery Beat:每天 02:00-08:00 持续运作(轮询),并通过
request_interval_seconds+ 每次处理上限(page/max_records/related)控制不超过明道云 QPS 限制。
更新(已实施):
- 已新增 Celery Beat:
flower/settings.py::CELERY_BEAT_SCHEDULE['mdy_plate_order_staging_sync']- 时间窗:02:00-07:59(
crontab(minute='*/2', hour='2-7')) - 任务:
api_v1.tasks.sync_mdy_plate_orders - 限流参数:
.envMDY_PLATE_ORDER_SYNC_REQUEST_INTERVAL_SECONDS(默认 0.05)
- 时间窗:02:00-07:59(