Initial commit

This commit is contained in:
Misaka_Company
2026-07-30 14:17:18 +08:00
commit 4dc563cdd9
16 changed files with 1144 additions and 0 deletions

124
README.md Normal file
View File

@@ -0,0 +1,124 @@
# WareShipManifest · 装箱单报表系统
基于 **ReportBro**`reportbro-lib`,纯 Python生成装箱单 PDF。报表定义SQL / 模板 / 数据装配)均为纯文本,可被 Git 管理后期对接真实打印机时PDF 方案可直接复用。
> 业务背景:把 CargoTrace 成品库分拣系统的装箱数据,打印成装箱单随货流转。
> 一个箱子一份 PDF展示该箱装了哪些内容物总排号及其产品信息。
## 快速开始
```bash
# 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
```
## 用法
```bash
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 可视化设计器,也不用其表格元素(行高不自适应、行不自动堆叠);
> 改用纯文本元素 + 细横线手工排版,坐标完全可控,靠字号/字重/留白建立层次。
### 改查询 / 数据装配
- SQL`reports/packing_list/query.sql`(参数化,禁字符串拼接)。
- 数据装配:`reports/packing_list/transform.py``build_context`(纯逻辑,含单测)。
### 跑测试
```bash
.venv/Scripts/python.exe -m pytest -q
```
### 中文字体
核心字体helvetica 等)无法编码中文,故通过 `core/fonts.py` 注册
`C:/Windows/Fonts/simhei.ttf`(黑体),模板样式 `font="simhei"`
跨机器部署若缺该字体,可用环境变量 `REPORT_CJK_FONT` 指定其它支持中文的 ttf。
## 技术说明
- **reportbro-lib**:纯 Python`pip install reportbro-lib`),无需 Docker / 浏览器 / 设计器常驻服务。
- 数据处理与展示分离:排序在 SQL、合计与日期在 transform、模板只渲染。
- 生成的 PDF 可用 `pymupdf``fitz`)渲染 PNG 做肉眼核对(验证用,非运行时依赖)。
## 路线图
- [ ] 后期对接真实打印机PDF 方案可直接复用)。
- [ ] 发货信息单(地址 / 收件人 / 总件数 / 物料编码)—— 与装箱单拆分,另出报表。