- 多工厂(factory 表) + 顶栏工厂下拉过滤, 库存按厂聚合 - 厂间调拨(transfer): 源厂减+目标厂加, 总库存不变, 双向流水对账 - 替代料关系(substitute): 出库/BOM领料/生产领料缺料时提示可替代料 - 流水台账(ledger): 入出按日期合并折叠, 按日期导出同一 Excel - 生产订单增强: 编辑/删除(级联清关联流水)/调入数量/确认调入=厂间调拨 - 入库新增送货日期字段; 出库物料编码扫码定位 - 重写 README 补全全部模块; .gitignore 排除 dist_pkg/build_pkg/*.db - 停止跟踪 instance/app.db(运行时自动生成)
86 lines
4.4 KiB
HTML
86 lines
4.4 KiB
HTML
{% extends "base.html" %}
|
||
{% block title %}订单 {{ o.order_no }}{% endblock %}
|
||
{% block content %}
|
||
<div class="toolbar">
|
||
<h3 style="margin:0">生产订单 {{ o.order_no }}</h3>
|
||
<span class="badge {{ 'ok' if o.status=='picked' else 'warn' }}">{{ '已领料' if o.status=='picked' else '待领料' }}</span>
|
||
<a class="btn" href="{{ url_for('order_edit', oid=o.id) }}">编辑订单</a>
|
||
</div>
|
||
<div class="card" style="margin-bottom:16px">
|
||
<p>BOM: <b>{{ bom.code if bom else '-' }}</b> ({{ bom.name if bom else '' }}) | 接单量: <b>{{ '%.2f'|format(o.qty) }}</b> | 生产工厂: <b>{{ factory.code if factory else '未指定(按汇总库存)' }}</b> | 经手人: {{ o.operator or '-' }}</p>
|
||
{% if o.remark %}<p class="small muted">备注: {{ o.remark }}</p>{% endif %}
|
||
</div>
|
||
|
||
<h3>领料需求与调入 (单套用量 × 接单量){% if factory %} | 按 {{ factory.code }} 工厂库存核算{% endif %}</h3>
|
||
|
||
<form method="post" action="{{ url_for('order_alloc_save', oid=o.id) }}">
|
||
<table class="tbl">
|
||
<thead><tr>
|
||
<th>物料编号</th><th>型号</th><th>需求数量</th>
|
||
<th>调入数量</th><th>当前库存</th><th>缺口</th><th>状态</th><th>可替代料</th>
|
||
</tr></thead>
|
||
<tbody>
|
||
{% for r in reqs %}
|
||
<tr class="{{ 'row-danger' if r.short else ('row-warn' if r.have < (r.m.safety_stock or 0)) }}">
|
||
<td><a href="{{ url_for('material_detail', mid=r.m.id) }}" title="进入工厂物料">{{ r.m.part_number }}</a></td>
|
||
<td>{{ r.m.manufacturer or '-' }}</td>
|
||
<td class="num">{{ '%.2f'|format(r.need) }}</td>
|
||
<td class="num">
|
||
{% if r.posted %}
|
||
<span class="badge ok" title="已生成入库流水">已调入 {{ '%.2f'|format(r.alloc) }}</span>
|
||
{% else %}
|
||
<input name="alloc_{{ r.m.id }}" type="number" step="0.01" min="0"
|
||
value="{{ '%.2f'|format(r.alloc) if r.alloc else '' }}"
|
||
placeholder="{{ '%.2f'|format(r.need) }}" style="width:96px">
|
||
{% endif %}
|
||
</td>
|
||
<td class="num">{{ '%.2f'|format(r.have) }}</td>
|
||
<td class="num">{{ '%.2f'|format(r.gap) }}</td>
|
||
<td><span class="badge {{ 'danger' if r.short else 'ok' }}">{{ '缺料' if r.short else '充足' }}</span></td>
|
||
<td class="small">
|
||
{% if r.subs %}
|
||
{% for s in r.subs %}
|
||
<span class="{{ 'badge ok' if s.available else 'badge danger' }}">{{ s.pn }}·{{ s.stock }}{% if s.available %}✓{% else %}✗{% endif %}</span>
|
||
{% endfor %}
|
||
{% else %}<span class="muted">—</span>{% endif %}
|
||
</td>
|
||
</tr>
|
||
{% else %}
|
||
<tr><td colspan="8" class="muted">该 BOM 没有组成物料</td></tr>
|
||
{% endfor %}
|
||
</tbody>
|
||
</table>
|
||
|
||
<div class="row-actions" style="flex-wrap:wrap; align-items:flex-end">
|
||
<label style="display:flex; flex-direction:column; gap:4px; font-size:13px">
|
||
调入来源工厂
|
||
<select name="from_factory_id" style="padding:6px 8px; min-width:160px">
|
||
{% for f in factories %}
|
||
{% if f.id != (o.factory_id or 0) %}
|
||
<option value="{{ f.id }}" {{ 'selected' if f.code=='SELF' else '' }}>{{ f.code }}({{ f.name or '—' }})</option>
|
||
{% endif %}
|
||
{% endfor %}
|
||
</select>
|
||
</label>
|
||
<button class="primary" type="submit">保存调入数量</button>
|
||
<button class="secondary" type="submit"
|
||
formaction="{{ url_for('order_alloc_post', oid=o.id) }}"
|
||
onclick="return confirm('确认将待调入数量从上方所选来源工厂调拨到生产工厂? 总库存不变, 仅厂间转移。');">确认调入(厂间调拨)</button>
|
||
</div>
|
||
<p class="small muted">「确认调入」是一次厂间调拨:从来源工厂出库减、生产工厂入库加,系统总库存不变。</p>
|
||
</form>
|
||
|
||
<div class="card" style="margin:14px 0">
|
||
<b>调入总览:</b> 已调入 <b>{{ posted_count }}</b> 项,合计 <b>{{ '%.2f'|format(posted_total) }}</b> 件;
|
||
计划调入合计 <b>{{ '%.2f'|format(planned_total) }}</b> 件。
|
||
</div>
|
||
|
||
{% if o.status != 'picked' %}
|
||
<form method="post" action="{{ url_for('order_pick', oid=o.id) }}" onsubmit="return confirm('确认按 BOM 生成领料出库? 库存不足将记为负并在看板预警。');">
|
||
<div class="row-actions"><button class="primary">确认领料出库</button></div>
|
||
</form>
|
||
{% else %}
|
||
<p class="flash ok">该订单已领料出库。</p>
|
||
{% endif %}
|
||
{% endblock %}
|