feat: 库存管理系统 MaterialWMS 初始版本

- Flask + SQLAlchemy 物料/入库/出库/BOM/生产订单全模块管理
- PyInstaller 打包为单文件 EXE (双击运行, 自动建库)
- 物料维度: 入库总数量 / 消耗总数量 / 逐次入库流水(含时间)
- BOM 详情展示组成物料的规格型号与单套用量
- 支持 Altium / 嘉立创 BOM 批量导入(文本与 Excel 双通道)
- 内置端到端验证脚本(tools/_exe_util.py 等, 清理进程树防残留)
This commit is contained in:
2026-09-11 15:41:56 +08:00
commit 7d34a481b3
38 changed files with 3601 additions and 0 deletions
+39
View File
@@ -0,0 +1,39 @@
{% extends "base.html" %}
{% block title %}BOM 明细 {{ b.code }}{% endblock %}
{% block content %}
<div class="toolbar" data-page-node-id="kijLoAphCatqmeteC0fLS8">
<h3 style="margin:0" data-page-node-id="ECJxkuTNaoeZCptb3hYWET">BOM 明细 · {{ b.code }}</h3>
<div data-page-node-id="W3YF2xKkzcqbLyQSQHmDv9">
<a class="btn" href="{{ url_for('boms') }}" data-page-node-id="mkt8bYpaiDpnsyNak2CwEx">← 返回 BOM 列表</a>
<a class="btn" href="{{ url_for('bom_edit', bid=b.id) }}" data-page-node-id="b8G1I4yNJvCie28XRFo93k">编辑</a>
</div>
</div>
<div class="card" style="margin-bottom:16px" data-page-node-id="BMc2NONnJUN8plt66uKp3k">
<table class="tbl" style="box-shadow:none" data-page-node-id="HuBqdlqwPqeqvRGoctqyFK">
<tbody data-page-node-id="xq9k2F2CKZNS1J5oXVzrxN">
<tr data-page-node-id="CSgYyr7zDavFkvrYRL7J2l"><th style="width:120px" data-page-node-id="YaqRj0xvW6swCf9HolEsdZ">BOM 型号</th><td data-page-node-id="W3h0NKaeFcWnSk6bqpmnfd">{{ b.code }}</td>
<th style="width:120px" data-page-node-id="GrBiPbEdCAMAtba0DGidm8">名称</th><td data-page-node-id="t0dNbwOJnGYpyrvlMpJzHS">{{ b.name or '-' }}</td></tr>
<tr data-page-node-id="xnlzfzKyPIY29LTkzF5Exj"><th data-page-node-id="loONdVka6TX9pWPbpWr85x">备注</th><td colspan="3" data-page-node-id="vOtWTckSv3MzklsdnlC0FE">{{ b.note or '-' }}</td></tr>
</tbody>
</table>
</div>
<h3 data-page-node-id="t3eVJx5yZD6C7dR2AhvvI1">组成物料(物料编号 / 规格型号 / 单套用量)</h3>
<table class="tbl" data-page-node-id="df7zG7vdcHnmIIpkdv6sIX">
<thead data-page-node-id="U5mUzLwlJBjGq8lEuFm0Yp"><tr data-page-node-id="B10e5ndG2Fo8DbA4uD8s5e"><th data-page-node-id="clptv2dGFiVnRCTmGNcxGx">#</th><th data-page-node-id="FrYt8QMtBKNICWDU3FNTwu">物料编号</th><th data-page-node-id="WHXRD4OE5syF9gB7S9xUtN">型号 / 规格</th><th data-page-node-id="SF4qN0XEJENLIO6zMz4Rqj">单位</th><th data-page-node-id="5IfMfV4HQupPKakWftwag4">单套用量</th></tr></thead>
<tbody data-page-node-id="JBr6qsb25DZ6OzSa4g7USe">
{% for r in rows %}
<tr data-page-node-id="IM9jYB1JuNEMAWNi8ehaaZ">
<td class="num" data-page-node-id="8ad0FCRnUybzeEWz8FbALx">{{ loop.index }}</td>
<td data-page-node-id="gbLKKUuIavKSsnyYDv5tXm"><a href="{{ url_for('material_detail', mid=r.m.id) }}" data-page-node-id="m53G2ARWr2Udxdxlffdd1l">{{ r.m.part_number }}</a></td>
<td data-page-node-id="vIrrECfeuKSVoBo8MG4qw8">{{ r.m.manufacturer or '-' }}</td>
<td data-page-node-id="LdQUt8z687YhTj9wNbXNLp">{{ r.m.unit }}</td>
<td class="num" data-page-node-id="m2vUEqKxHfCxdgKNKdrMZS">{{ '%.4g'|format(r.qty) }}</td>
</tr>
{% else %}
<tr data-page-node-id="HRMX6kXmTYyKrAC01CI6EK"><td colspan="5" class="muted" data-page-node-id="G4RCcAkiwklmllhidB6cEW">该 BOM 还没有组成物料</td></tr>
{% endfor %}
</tbody>
</table>
{% endblock %}