Misaka_Company 4dc563cdd9 Initial commit
2026-07-30 14:17:18 +08:00
2026-07-30 14:17:18 +08:00
2026-07-30 14:17:18 +08:00
2026-07-30 14:17:18 +08:00
2026-07-30 14:17:18 +08:00
2026-07-30 14:17:18 +08:00
2026-07-30 14:17:18 +08:00
2026-07-30 14:17:18 +08:00
2026-07-30 14:17:18 +08:00

WareShipManifest · 装箱单报表系统

基于 ReportBroreportbro-lib,纯 Python生成装箱单 PDF。报表定义SQL / 模板 / 数据装配)均为纯文本,可被 Git 管理后期对接真实打印机时PDF 方案可直接复用。

业务背景:把 CargoTrace 成品库分拣系统的装箱数据,打印成装箱单随货流转。 一个箱子一份 PDF展示该箱装了哪些内容物总排号及其产品信息。

快速开始

# 1. 建虚拟环境并装依赖
python -m venv .venv
.venv/Scripts/python.exe -m pip install -r requirements.txt   # Windows / Git Bash

# 2. 配置数据库(复制模板并填凭据,或直接复用 services/fastapi 的 settings.yaml
cp config/settings.example.yaml config/settings.yaml
#   编辑 config/settings.yaml 填入真实 host/数据库/账号密码

# 3. 生成装箱单
.venv/Scripts/python.exe run.py --report packing_list \
    --param paichan_no=R04398 --param box_no=1 \
    --output out/R04398_box1.pdf
# → out/R04398_box1.pdf

用法

python run.py --report packing_list \
    --param paichan_no=<排产号> \
    --param box_no=<箱号> \
    --output <输出路径.pdf>      # 可选,默认 out/<排产号>_box<箱号>.pdf
  • 缺少参数 → 提示缺少哪个参数。
  • 排产号 + 箱号无装箱明细 → 提示「找不到该箱」。
  • 均以非零退出码退出,便于脚本集成。

报表内容

区域 内容
标题 装箱单 / PACKING LIST + 分隔线
信息条 排产号、箱号、装箱日期、订单号2×2 网格,标签灰 + 值黑)
列头 序号 · 总排号 · 产品型号 · 量程 · 位号 · 数量 · 工令号(小号灰)
明细 逐行文本,行间细灰线;无网格边框
合计 合计 N 件(右对齐于数量列下)
页脚 生成时间
  • 无边框、单色、字体驱动:靠字号 / 字重 / 留白 / 细灰分隔线建立层次,不用表格网格。
  • 位号:合同表字段,多数订单为空,有则显示、无则留白。
  • 产品型号为超长编码串,按列宽换行,行高自适应。

数据来源

作用
CargoTrace.finished_goods_box 箱头(排产号 + 箱号 + 装箱时间)
CargoTrace.finished_goods_box_item 箱内明细(总排号 + 装入数量)
productionContractData.26年压力表合同数据 / 26年温度计合同数据 产品信息(型号/量程/位号/工令号/订单号)

同一总排号只命中压力表或温度计其中一张表,用双 LEFT JOIN + COALESCE 取产品字段, 避免前缀误匹配(26BW 不会被 26B% 命中)。

目录结构

WareShipManifest/
├── config/
│   ├── settings.example.yaml   # 配置模板(提交)
│   └── settings.yaml           # 真实凭据gitignore
├── core/
│   ├── settings.py             # 读 yaml → mssql+pyodbc 连接 URL
│   ├── db.py                   # run_query(sql, params) 参数化绑定
│   └── fonts.py                # 中文字体注册simhei via additional_fonts
├── reports/packing_list/
│   ├── query.sql               # 参数化查询(:paichan_no / :box_no
│   ├── transform.py            # build_context(rows) → 预展开标量参数 + 行高估算(纯逻辑)
│   ├── _build_template.py      # 样式 + 运行时按数据动态布局的文档元素(无边框列表式)
│   └── config.yaml             # 报表元信息(参数/字段说明)
├── tests/test_transform.py     # 纯逻辑单测
├── run.py                      # CLI 入口
├── requirements.txt
└── README.md

开发

改报表版式(列宽 / 字号 / 边距 / 配色 / 行距)

版式全部在 reports/packing_list/_build_template.py 中以代码定义(常量 + 样式工厂)。 文档元素在运行时按数据动态生成(明细行高度自适应),无需预生成模板文件—— 直接改代码后重跑 run.py 即生效。

不使用 ReportBro 可视化设计器,也不用其表格元素(行高不自适应、行不自动堆叠); 改用纯文本元素 + 细横线手工排版,坐标完全可控,靠字号/字重/留白建立层次。

改查询 / 数据装配

  • SQLreports/packing_list/query.sql(参数化,禁字符串拼接)。
  • 数据装配:reports/packing_list/transform.pybuild_context(纯逻辑,含单测)。

跑测试

.venv/Scripts/python.exe -m pytest -q

中文字体

核心字体helvetica 等)无法编码中文,故通过 core/fonts.py 注册 C:/Windows/Fonts/simhei.ttf(黑体),模板样式 font="simhei"。 跨机器部署若缺该字体,可用环境变量 REPORT_CJK_FONT 指定其它支持中文的 ttf。

技术说明

  • reportbro-lib:纯 Pythonpip install reportbro-lib),无需 Docker / 浏览器 / 设计器常驻服务。
  • 数据处理与展示分离:排序在 SQL、合计与日期在 transform、模板只渲染。
  • 生成的 PDF 可用 pymupdffitz)渲染 PNG 做肉眼核对(验证用,非运行时依赖)。

路线图

  • 后期对接真实打印机PDF 方案可直接复用)。
  • 发货信息单(地址 / 收件人 / 总件数 / 物料编码)—— 与装箱单拆分,另出报表。
Description
Warehouse shipping manifest generator
Readme 45 KiB
Languages
Python 100%