From 5bcbc8260c2ed9af2a5e52ca3e655dfbc9a17719 Mon Sep 17 00:00:00 2001 From: zzh Date: Mon, 18 May 2026 11:35:41 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=8F=91=E8=B4=A7=E5=8D=95?= =?UTF-8?q?=E4=B8=8A=E4=BC=A0=E5=92=8C=E7=A1=AE=E8=AE=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/index.html | 2 + frontend/js/components/shipment-orders.js | 405 ++++++++++++++++++++++ frontend/js/router.js | 3 +- server/app.py | 193 +++++++++++ 4 files changed, 602 insertions(+), 1 deletion(-) create mode 100644 frontend/js/components/shipment-orders.js diff --git a/frontend/index.html b/frontend/index.html index 5074536..82b82ca 100755 --- a/frontend/index.html +++ b/frontend/index.html @@ -175,6 +175,7 @@
借出单 借出还入单 + 发货单
@@ -533,6 +534,7 @@ + diff --git a/frontend/js/components/shipment-orders.js b/frontend/js/components/shipment-orders.js new file mode 100644 index 0000000..f94805b --- /dev/null +++ b/frontend/js/components/shipment-orders.js @@ -0,0 +1,405 @@ +// 仓库管理 —— 发货单 +window.ShipmentOrders = (() => { + let currentUser = null; + let itemIndex = 0; + + const isSuperadmin = () => currentUser && currentUser.role === 'superadmin'; + const isAdmin = () => currentUser && currentUser.role === 'admin'; + + const statusLabel = s => ({ pending: '待确认', approved: '已确认', rejected: '已驳回' }[s] || s); + const statusColor = s => ({ pending: '#f59e0b', approved: '#10b981', rejected: '#ef4444' }[s] || '#94a3b8'); + + const render = async () => { + try { + const res = await fetch('/api/auth/me', { credentials: 'include' }); + currentUser = res.ok ? await res.json() : null; + } catch (e) { currentUser = null; } + return ` +
+
+
+ + `; + }; + + const init = async () => { + stopPolling(); + if (!currentUser) { + try { + const res = await fetch('/api/auth/me', { credentials: 'include' }); + currentUser = res.ok ? await res.json() : null; + } catch (e) { currentUser = null; } + } + const el = document.getElementById('shipment-content'); + if (!el) return; + if (isSuperadmin()) { await renderSuperadminView(el); startPolling(); } + else if (isAdmin()) { await renderAdminView(el); startPolling(); } + else el.innerHTML = '
无权限
'; + }; + + let _modelList = []; + + const loadModels = async () => { + const res = await fetch('/api/warehouse/shipment-models', { credentials: 'include' }); + const data = res.ok ? await res.json() : { list: [] }; + _modelList = data.list || []; + }; + + const refreshModelDatalist = () => { + const dl = document.getElementById('sh-model-datalist'); + if (!dl) return; + dl.innerHTML = _modelList.map(m => `