新增订单收票付款交货跟进并完善使用升级手册
增加部分付款和部分交货状态、工作台筛选、权限校验、跟进记录及 v4 数据迁移;补充 Windows EXE 构建与验收脚本。附 16 页 PDF 使用升级手册及企业微信详细配置说明、生成脚本和测试截图。验证:76 项回归测试、EXE 浏览器验收与 PDF 逐页校验通过。
This commit is contained in:
@@ -35,6 +35,6 @@
|
||||
{% endwith %}
|
||||
{% block body %}{% endblock %}
|
||||
</div>
|
||||
<footer class="foot">{{ COMPANY_NAME }} · 采购订单管理系统 v3.0</footer>
|
||||
<footer class="foot">{{ COMPANY_NAME }} · 采购订单管理系统 v4.0</footer>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -8,6 +8,31 @@
|
||||
<div class="stat"><div class="v">{{ '%.2f'|format(month_total) }}</div><div class="k">审批通过订单总额(元)</div></div>
|
||||
</div>
|
||||
|
||||
<div class="card tracking-dashboard">
|
||||
<div class="card-head"><h2>付款与交货概况</h2><a href="{{ url_for('orders', status='approved') }}">查看全部</a></div>
|
||||
<p class="muted">统计当前可见、审批通过的订单。各类数量可能重叠;部分付款和部分交货按订单状态统计。</p>
|
||||
<div class="stat-row">
|
||||
{% for key in ['prepayment','invoice_due','unpaid','paid','undelivered','partial_delivery','paid_undelivered','completed'] %}
|
||||
<a class="stat tracking-stat" data-tracking="{{ key }}" href="{{ url_for('orders', tracking=key) }}"><div class="v">{{ tracking_counts[key] }}</div><div class="k">{{ TRACKING_FILTERS[key] }}</div></a>
|
||||
{% endfor %}
|
||||
</div>
|
||||
<div class="toolbar tracking-shortcuts">{% for key in ['partial_payment','delivered','unrecorded','recheck'] %}<a class="btn sm" data-tracking="{{ key }}" href="{{ url_for('orders', tracking=key) }}">{{ TRACKING_FILTERS[key] }}({{ tracking_counts[key] }})</a>{% endfor %}</div>
|
||||
<h3>最近审批通过的订单</h3>
|
||||
<table class="grid tracking-table">
|
||||
<tr><th>订单 / 供应商</th><th class="num">订单金额</th><th>预付款</th><th>收票</th><th>付款</th><th>交货</th><th>操作</th></tr>
|
||||
{% for o in tracking_rows %}
|
||||
<tr>
|
||||
<td><a href="{{ url_for('order_view', oid=o.id) }}#order-tracking">{{ o.order_no }}</a><div class="muted">{{ o.supplier_name }}</div>{% if o.fulfillment_stale or o.payment_stale %}<div class="tracking-warning">变更后待核对</div>{% endif %}</td>
|
||||
<td class="num">{{ '%.2f'|format(o.total_amount) }}</td><td>{{ '需要' if o.needs_prepayment else '—' }}</td>
|
||||
<td><span class="badge track-{{ o.invoice_status }}">{{ o.invoice_status_text }}</span></td>
|
||||
<td><span class="badge track-{{ o.payment_status }}">{{ o.payment_status_text }}</span></td>
|
||||
<td><span class="badge track-{{ o.delivery_status }}">{{ o.delivery_status_text }}</span></td>
|
||||
<td><a class="btn sm" href="{{ url_for('order_view', oid=o.id) }}#order-tracking">查看跟进</a></td>
|
||||
</tr>
|
||||
{% else %}<tr><td colspan="7" class="center muted">暂无审批通过的订单</td></tr>{% endfor %}
|
||||
</table>
|
||||
</div>
|
||||
|
||||
{% if todo %}
|
||||
<div class="card">
|
||||
<h2>待我处理({{ todo|length }})</h2>
|
||||
|
||||
@@ -0,0 +1,44 @@
|
||||
<div class="card" id="order-tracking">
|
||||
<h2>付款与交货跟进</h2>
|
||||
<div class="tracking-summary">
|
||||
<div><label>预付款安排</label><b>{{ '需提前付款' if o.needs_prepayment else '正常付款' }}</b></div>
|
||||
<div><label>收票情况</label><span class="badge track-{{ o.invoice_status }}">{{ o.invoice_status_text }}</span></div>
|
||||
<div><label>付款情况</label><span class="badge track-{{ o.payment_status }}">{{ o.payment_status_text }}</span>{% if o.payment_date %}<div class="muted">{{ o.payment_date }}</div>{% endif %}</div>
|
||||
<div><label>交货情况</label><span class="badge track-{{ o.delivery_status }}">{{ o.delivery_status_text }}</span></div>
|
||||
</div>
|
||||
{% if o.fulfillment_stale or o.payment_stale %}
|
||||
<p class="hint">订单内容已变更,以下记录来自变更前:{{ '采购跟进' if o.fulfillment_stale else '' }}{{ '、' if o.fulfillment_stale and o.payment_stale else '' }}{{ '付款情况' if o.payment_stale else '' }}。请对应经办人核对后保存确认。</p>
|
||||
{% endif %}
|
||||
{% if o.status != 'approved' %}<p class="muted">审批通过后可登记付款、收票和交货情况。已有跟进记录保留供查询。</p>{% endif %}
|
||||
{% if o.fulfillment_note %}<p>采购跟进备注:{{ o.fulfillment_note }}</p>{% endif %}
|
||||
{% if o.payment_note %}<p>付款备注:{{ o.payment_note }}</p>{% endif %}
|
||||
<div class="tracking-forms">
|
||||
{% if may_follow %}
|
||||
<form id="follow-up-form" method="post" action="{{ url_for('order_follow_up', oid=o.id) }}">
|
||||
<h3>制单员跟进</h3>
|
||||
<input type="hidden" name="csrf_token" value="{{ csrf_token() }}">
|
||||
<input type="hidden" name="row_version" value="{{ o.row_version }}">
|
||||
<div class="field"><label for="needs-prepayment">付款安排</label><select id="needs-prepayment" name="needs_prepayment"><option value="0" {{ 'selected' if not o.needs_prepayment else '' }}>正常付款</option><option value="1" {{ 'selected' if o.needs_prepayment else '' }}>需提前付款</option></select></div>
|
||||
<div class="form-grid two">
|
||||
<div class="field"><label for="invoice-status">收票情况</label><select id="invoice-status" name="invoice_status">{% for key, label in INVOICE_STATUS.items() %}<option value="{{ key }}" {{ 'selected' if o.invoice_status == key else '' }}>{{ label }}</option>{% endfor %}</select></div>
|
||||
<div class="field"><label for="delivery-status">交货情况</label><select id="delivery-status" name="delivery_status">{% for key, label in DELIVERY_STATUS.items() %}<option value="{{ key }}" {{ 'selected' if o.delivery_status == key else '' }}>{{ label }}</option>{% endfor %}</select></div>
|
||||
</div>
|
||||
<div class="field"><label for="fulfillment-note">跟进备注(选填)</label><textarea id="fulfillment-note" name="fulfillment_note" maxlength="500" placeholder="例如:先付30%预付款,已收到第一批货">{{ o.fulfillment_note }}</textarea></div>
|
||||
<div class="field"><label for="follow-up-reason">更正原因(回退状态时必填)</label><input id="follow-up-reason" name="reason" maxlength="500"></div>
|
||||
<button class="btn primary">保存采购跟进</button>
|
||||
</form>
|
||||
{% endif %}
|
||||
{% if may_pay %}
|
||||
<form id="payment-form" method="post" action="{{ url_for('order_payment', oid=o.id) }}">
|
||||
<h3>审批员登记付款</h3>
|
||||
<input type="hidden" name="csrf_token" value="{{ csrf_token() }}">
|
||||
<input type="hidden" name="row_version" value="{{ o.row_version }}">
|
||||
<div class="field"><label for="payment-status">付款状态</label><select id="payment-status" name="payment_status">{% for key, label in PAYMENT_STATUS.items() %}<option value="{{ key }}" {{ 'selected' if o.payment_status == key else '' }}>{{ label }}</option>{% endfor %}</select></div>
|
||||
<div class="field"><label for="payment-date">实际付款日期(部分付款或已付款时必填)</label><input id="payment-date" type="date" name="payment_date" value="{{ o.payment_date }}"></div>
|
||||
<div class="field"><label for="payment-note">付款备注(选填)</label><textarea id="payment-note" name="payment_note" maxlength="500" placeholder="例如:已付首款,剩余尾款待交货后支付">{{ o.payment_note }}</textarea></div>
|
||||
<div class="field"><label for="payment-reason">更正原因(回退状态时必填)</label><input id="payment-reason" name="reason" maxlength="500"></div>
|
||||
<button class="btn primary">保存付款状态</button>
|
||||
</form>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
@@ -81,6 +81,8 @@
|
||||
{% if o.note %}<p class="muted">补充说明:{{ o.note }}</p>{% endif %}
|
||||
</div>
|
||||
|
||||
{% include 'order_tracking.html' %}
|
||||
|
||||
<div class="card">
|
||||
<h2>审批流程</h2>
|
||||
<table class="grid approval-flow">
|
||||
@@ -172,7 +174,7 @@
|
||||
<h3>提交版本</h3>
|
||||
{% for version in o.versions %}<p><a href="{{ url_for('order_version',oid=o.id,revision=version.revision) }}">第 {{ version.revision }} 次提交 · {{ version.created_at.strftime('%Y-%m-%d %H:%M') }}</a>{{ ' · 已归档正式文件' if version.pdf_data else '' }}</p>
|
||||
{% else %}<p class="muted">尚无提交快照;升级前的审批记录可在下方查看。</p>{% endfor %}
|
||||
<h3>审批记录</h3>
|
||||
<h3>审批与跟进记录</h3>
|
||||
<ul class="timeline">
|
||||
{% for lg in o.logs %}
|
||||
<li>{{ lg.created_at.strftime('%Y-%m-%d %H:%M') }} · {{ lg.user_name }} · {{ lg.action }}(第 {{ lg.revision }} 次提交)
|
||||
|
||||
@@ -19,6 +19,10 @@
|
||||
<input type="date" name="date_from" value="{{ args.get('date_from','') }}" style="width:150px;">
|
||||
<span>~</span>
|
||||
<input type="date" name="date_to" value="{{ args.get('date_to','') }}" style="width:150px;">
|
||||
<select name="tracking" aria-label="付款与交货筛选" style="width:170px;">
|
||||
<option value="">全部跟进情况</option>
|
||||
{% for key, label in TRACKING_FILTERS.items() %}<option value="{{ key }}" {{ 'selected' if args.get('tracking') == key else '' }}>{{ label }}</option>{% endfor %}
|
||||
</select>
|
||||
<button class="btn primary">查询</button>
|
||||
<span class="grow"></span>
|
||||
<a class="btn" href="{{ url_for('export_ledger') }}">导出 Excel 台账</a>
|
||||
@@ -27,7 +31,7 @@
|
||||
<table class="grid">
|
||||
<tr>
|
||||
<th>单号</th><th>类型</th><th>供应商</th><th>采购日期</th><th class="num">金额</th>
|
||||
<th>状态</th><th>制单</th><th>审批</th><th class="nowrap">操作</th>
|
||||
<th>审批状态</th><th>付款与交货</th><th>制单</th><th>审批</th><th class="nowrap">操作</th>
|
||||
</tr>
|
||||
{% for o in rows %}
|
||||
<tr>
|
||||
@@ -37,6 +41,13 @@
|
||||
<td class="nowrap">{{ o.order_date }}</td>
|
||||
<td class="num">{{ '%.2f'|format(o.total_amount) }}</td>
|
||||
<td><span class="badge {{ o.status }}">{{ o.status_text }}</span></td>
|
||||
<td>
|
||||
{% if o.needs_prepayment %}<span class="badge track-partial">需提前付款</span>{% endif %}
|
||||
<span class="badge track-{{ o.invoice_status }}">收票:{{ o.invoice_status_text }}</span>
|
||||
<span class="badge track-{{ o.payment_status }}">付款:{{ o.payment_status_text }}</span>
|
||||
<span class="badge track-{{ o.delivery_status }}">交货:{{ o.delivery_status_text }}</span>
|
||||
{% if o.fulfillment_stale or o.payment_stale %}<div class="tracking-warning">变更后待核对</div>{% endif %}
|
||||
</td>
|
||||
<td>{{ o.created_by_name }}</td>
|
||||
<td>{{ o.approved_by or '-' }}</td>
|
||||
<td class="nowrap">
|
||||
@@ -45,7 +56,7 @@
|
||||
</td>
|
||||
</tr>
|
||||
{% else %}
|
||||
<tr><td colspan="9" class="center muted">没有符合条件的订单</td></tr>
|
||||
<tr><td colspan="10" class="center muted">没有符合条件的订单</td></tr>
|
||||
{% endfor %}
|
||||
</table>
|
||||
</div>
|
||||
|
||||
Reference in New Issue
Block a user