完善采购审批流程、企业微信通知和采购专用章
This commit is contained in:
@@ -5,6 +5,8 @@
|
||||
<div class="card">
|
||||
<h2>单据信息</h2>
|
||||
<form method="post" id="orderForm">
|
||||
<input type="hidden" name="csrf_token" value="{{ csrf_token() }}">
|
||||
<input type="hidden" name="row_version" value="{{ o.row_version }}">
|
||||
<div class="form-grid">
|
||||
<div><label>采购单号</label><input type="text" value="{{ o.order_no }}" disabled></div>
|
||||
<div><label>采购日期</label><input type="date" name="order_date" value="{{ o.order_date or '' }}"></div>
|
||||
@@ -66,8 +68,8 @@
|
||||
</td>
|
||||
<td><input type="text" name="item_spec" value="{{ it.material_spec or '' }}"></td>
|
||||
<td><input type="text" name="item_unit" value="{{ it.unit or '' }}"></td>
|
||||
<td><input type="number" step="0.0001" name="item_qty" class="qty" value="{{ it.qty or 0 }}"></td>
|
||||
<td><input type="number" step="0.0001" name="item_price" class="price" value="{{ it.price or 0 }}"></td>
|
||||
<td><input type="number" min="0" max="999999999" step="0.0001" name="item_qty" class="qty" value="{{ it.qty or 0 }}"></td>
|
||||
<td><input type="number" min="0" max="999999999" step="0.0001" name="item_price" class="price" value="{{ it.price or 0 }}"></td>
|
||||
<td><input type="text" class="amt" value="{{ '%.2f'|format(it.amount or 0) }}" disabled></td>
|
||||
<td><input type="date" name="item_date" value="{{ it.delivery_date or '' }}"></td>
|
||||
<td><input type="text" name="item_remark" value="{{ it.remark or '' }}"></td>
|
||||
@@ -87,8 +89,8 @@
|
||||
</td>
|
||||
<td><input type="text" name="item_spec" value=""></td>
|
||||
<td><input type="text" name="item_unit" value=""></td>
|
||||
<td><input type="number" step="0.0001" name="item_qty" class="qty" value="0"></td>
|
||||
<td><input type="number" step="0.0001" name="item_price" class="price" value="0"></td>
|
||||
<td><input type="number" min="0" max="999999999" step="0.0001" name="item_qty" class="qty" value="0"></td>
|
||||
<td><input type="number" min="0" max="999999999" step="0.0001" name="item_price" class="price" value="0"></td>
|
||||
<td><input type="text" class="amt" value="0.00" disabled></td>
|
||||
<td><input type="date" name="item_date" value=""></td>
|
||||
<td><input type="text" name="item_remark" value=""></td>
|
||||
@@ -100,25 +102,22 @@
|
||||
<button type="button" class="btn" onclick="addRow()">+ 添加一行</button>
|
||||
<span class="grow"></span>
|
||||
<span class="total-bar">合计:<span class="amt" id="totalAmt">{{ '%.2f'|format(o.total_amount) }}</span> 元
|
||||
<span class="muted" id="totalCn">{{ total_cn }}</span></span>
|
||||
<span class="muted">逐行四舍五入到分后合计</span></span>
|
||||
</div>
|
||||
|
||||
<h3>补充说明</h3>
|
||||
<textarea name="note" placeholder="选填,会打印在 PDF 备注区">{{ o.note or '' }}</textarea>
|
||||
|
||||
<div style="margin-top:16px;">
|
||||
<button class="btn primary" type="submit">保存</button>
|
||||
<button class="btn primary" type="submit" name="intent" value="save">保存草稿</button>
|
||||
<input name="comment" placeholder="提交说明(选填)" style="width:220px;">
|
||||
<button class="btn ok" type="submit" name="intent" value="submit">保存并提交审批</button>
|
||||
<a class="btn" href="{{ url_for('order_view', oid=o.id) }}">查看订单</a>
|
||||
<a class="btn" href="{{ url_for('order_pdf', oid=o.id) }}" target="_blank">预览 PDF</a>
|
||||
</div>
|
||||
</form>
|
||||
|
||||
<form method="post" action="{{ url_for('order_submit', oid=o.id) }}" style="margin-top:10px;">
|
||||
<div class="toolbar">
|
||||
<input type="text" name="comment" placeholder="提交说明(选填)" style="width:260px;">
|
||||
<button class="btn ok">提交主管审核</button>
|
||||
</div>
|
||||
</form>
|
||||
|
||||
</div>
|
||||
|
||||
<div class="card">
|
||||
@@ -129,6 +128,8 @@
|
||||
<a href="{{ url_for('import_template') }}">下载导入模板</a>
|
||||
</div>
|
||||
<form method="post" action="{{ url_for('import_excel', oid=o.id) }}" enctype="multipart/form-data" class="toolbar">
|
||||
<input type="hidden" name="csrf_token" value="{{ csrf_token() }}">
|
||||
<input type="hidden" name="row_version" value="{{ o.row_version }}">
|
||||
<input type="file" name="file" accept=".xls,.xlsx" required style="width:280px;">
|
||||
<select name="mode" style="width:140px;">
|
||||
<option value="append">追加到现有明细</option>
|
||||
@@ -138,6 +139,7 @@
|
||||
</form>
|
||||
</div>
|
||||
|
||||
<script src="{{ url_for('static', filename='money.js') }}"></script>
|
||||
<script>
|
||||
const MATERIALS = {{ materials|map(attribute='id')|list|tojson }};
|
||||
function bindRow(tr){
|
||||
@@ -154,20 +156,21 @@ function bindRow(tr){
|
||||
});
|
||||
}
|
||||
function calc(){
|
||||
let total = 0;
|
||||
let total = 0n, valid = true;
|
||||
document.querySelectorAll('#itemTable tr').forEach((tr, idx) => {
|
||||
const q = parseFloat(tr.querySelector('.qty')?.value || 0);
|
||||
const p = parseFloat(tr.querySelector('.price')?.value || 0);
|
||||
const a = (isNaN(q) ? 0 : q) * (isNaN(p) ? 0 : p);
|
||||
const amt = tr.querySelector('.amt');
|
||||
if (amt) amt.value = a.toFixed(2);
|
||||
total += a;
|
||||
const seq = tr.querySelector('.seq');
|
||||
if (seq) seq.textContent = idx;
|
||||
const qty = tr.querySelector('.qty'), price = tr.querySelector('.price');
|
||||
if (!qty || !price) return;
|
||||
try {
|
||||
const cents = POMoney.lineCents(qty.value, price.value);
|
||||
tr.querySelector('.amt').value = POMoney.format(cents);
|
||||
total += cents;
|
||||
} catch (e) { tr.querySelector('.amt').value = '请检查'; valid = false; }
|
||||
tr.querySelector('.seq').textContent = idx;
|
||||
});
|
||||
document.getElementById('totalAmt').textContent = total.toFixed(2);
|
||||
document.getElementById('totalAmt').textContent = valid ? POMoney.format(total) : '请检查数量和单价';
|
||||
}
|
||||
function addRow(){
|
||||
dirty = true;
|
||||
// 从 <template> 克隆,避免"明细为空时没有可复制的行"导致点击无反应
|
||||
const t = document.getElementById('itemTable');
|
||||
const tr = document.getElementById('rowTpl').content.firstElementChild.cloneNode(true);
|
||||
@@ -180,6 +183,7 @@ function addRow(){
|
||||
bindRow(tr); calc();
|
||||
}
|
||||
function delRow(btn){
|
||||
dirty = true;
|
||||
btn.closest('tr').remove(); calc();
|
||||
}
|
||||
document.querySelectorAll('#itemTable tr').forEach(bindRow);
|
||||
@@ -197,5 +201,17 @@ document.getElementById('supplierPick').addEventListener('change', async functio
|
||||
document.getElementById('supplier_bank_account').value = s.bank_account || '';
|
||||
document.getElementById('payment_terms').value = s.payment_terms || '';
|
||||
});
|
||||
let dirty = false;
|
||||
const orderForm = document.getElementById('orderForm');
|
||||
orderForm.addEventListener('input', () => { dirty = true; });
|
||||
orderForm.addEventListener('change', () => { dirty = true; });
|
||||
orderForm.addEventListener('submit', () => { dirty = false; });
|
||||
document.querySelector('[action$="/import_excel"]').addEventListener('submit', e => {
|
||||
if (dirty) { e.preventDefault(); alert('请先保存当前修改,再导入明细。'); }
|
||||
});
|
||||
window.addEventListener('beforeunload', e => { if (dirty) { e.preventDefault(); e.returnValue = ''; } });
|
||||
document.querySelectorAll('a[target="_blank"]').forEach(a => a.addEventListener('click', e => {
|
||||
if (dirty) { e.preventDefault(); alert('请先保存当前修改,再预览 PDF。'); }
|
||||
}));
|
||||
</script>
|
||||
{% endblock %}
|
||||
|
||||
Reference in New Issue
Block a user