From 573cf9feb503fe38da973c214e06df507bb4c761 Mon Sep 17 00:00:00 2001 From: zzh Date: Mon, 11 May 2026 13:41:05 +0800 Subject: [PATCH] bug fix --- frontend/js/api.js | 3 + frontend/js/components/initial-stock.js | 225 ++++++++++++- frontend/js/components/shipment-query.js | 4 + frontend/js/components/shipment-summary.js | 60 +++- frontend/js/components/shipments.js | 114 ++++++- server/app.py | 368 ++++++++++++++++++++- server/data.db | Bin 11964416 -> 12419072 bytes 7 files changed, 755 insertions(+), 19 deletions(-) diff --git a/frontend/js/api.js b/frontend/js/api.js index ea322b9..2459cc2 100755 --- a/frontend/js/api.js +++ b/frontend/js/api.js @@ -171,6 +171,9 @@ const API = (() => { listRepairs: () => request('/list/repairs'), listDefects: () => request('/list/defects'), listShipments: () => request('/list/shipments'), + listShipmentPlatforms: () => request('/shipments/platforms'), + addShipmentPlatform: (name) => request('/shipments/platforms', { method: 'POST', body: JSON.stringify({ name }) }), + deleteShipmentPlatform: (code) => request(`/shipments/platforms/${encodeURIComponent(code)}`, { method: 'DELETE' }), auditPdd: (params={}) => request('/audit/pdd' + buildQuery(params)), auditYt: (params={}) => request('/audit/yt' + buildQuery(params)), auditTx: (params={}) => request('/audit/tx' + buildQuery(params)), diff --git a/frontend/js/components/initial-stock.js b/frontend/js/components/initial-stock.js index 84c4e76..9df3805 100755 --- a/frontend/js/components/initial-stock.js +++ b/frontend/js/components/initial-stock.js @@ -90,6 +90,14 @@
+
+ + +
@@ -325,6 +333,15 @@ document.getElementById('search-keyword')?.addEventListener('keypress', (e) => { if (e.key === 'Enter') InitialStock.search(); }); + + document.addEventListener('click', (e) => { + const exportMenu = document.getElementById('export-menu'); + const exportBtn = document.getElementById('export-btn'); + if (exportMenu && !exportMenu.contains(e.target) && e.target !== exportBtn) { + exportMenu.style.display = 'none'; + } + }); + loadList(); loadFactories(); }, 100); @@ -656,6 +673,208 @@ return String(str).replace(/&/g, '&').replace(//g, '>').replace(/"/g, '"'); } + function toggleExportMenu(event) { + event.stopPropagation(); + const menu = document.getElementById('export-menu'); + menu.style.display = menu.style.display === 'none' ? 'block' : 'none'; + } + + async function ensureXLSXLoaded() { + if (typeof XLSX === 'undefined') { + try { + await loadXLSXLibrary(); + } catch (e) { + throw new Error('无法加载 Excel 库,请刷新页面重试'); + } + } + } + + function loadXLSXLibrary() { + return new Promise((resolve, reject) => { + if (typeof XLSX !== 'undefined') { + resolve(); + return; + } + const script = document.createElement('script'); + script.src = 'https://cdn.jsdelivr.net/npm/xlsx@0.18.5/dist/xlsx.full.min.js'; + script.onload = () => resolve(); + script.onerror = () => reject(new Error('加载 XLSX 库失败')); + document.head.appendChild(script); + }); + } + + async function exportAll() { + try { + document.getElementById('export-menu').style.display = 'none'; + + if (stockList.length === 0) { + alert('没有数据可导出'); + return; + } + + await ensureXLSXLoaded(); + + const exportData = stockList.map(item => ({ + '物料编码': item.material_code || '', + '物料名称': item.material_name || '', + '库存数量': item.stock_qty || 0, + '单位': item.unit || 'pcs', + '最小包装': item.min_package || 1, + '供应商': item.supplier || '', + '工厂': item.factory || '', + '备注': item.remark || '', + '更新时间': formatTime(item.updated_at) + })); + + const ws = XLSX.utils.json_to_sheet(exportData); + const wb = XLSX.utils.book_new(); + XLSX.utils.book_append_sheet(wb, ws, '期初库存'); + + const colWidths = [ + { wch: 15 }, + { wch: 25 }, + { wch: 10 }, + { wch: 8 }, + { wch: 10 }, + { wch: 20 }, + { wch: 15 }, + { wch: 30 }, + { wch: 18 } + ]; + ws['!cols'] = colWidths; + + const timestamp = new Date().toISOString().slice(0, 19).replace(/:/g, '-'); + const filename = `期初库存_全部_${timestamp}.xlsx`; + + XLSX.writeFile(wb, filename); + + console.log(`成功导出 ${exportData.length} 条数据到 ${filename}`); + + } catch (err) { + console.error('导出失败:', err); + alert('导出失败: ' + err.message); + } + } + + async function exportSelected() { + try { + document.getElementById('export-menu').style.display = 'none'; + + const checked = document.querySelectorAll('.row-checkbox:checked'); + if (checked.length === 0) { + alert('请先选择要导出的数据'); + return; + } + + const selectedIds = Array.from(checked).map(cb => parseInt(cb.dataset.id)); + const selectedData = stockList.filter(item => selectedIds.includes(item.id)); + + await ensureXLSXLoaded(); + + const exportData = selectedData.map(item => ({ + '物料编码': item.material_code || '', + '物料名称': item.material_name || '', + '库存数量': item.stock_qty || 0, + '单位': item.unit || 'pcs', + '最小包装': item.min_package || 1, + '供应商': item.supplier || '', + '工厂': item.factory || '', + '备注': item.remark || '', + '更新时间': formatTime(item.updated_at) + })); + + const ws = XLSX.utils.json_to_sheet(exportData); + const wb = XLSX.utils.book_new(); + XLSX.utils.book_append_sheet(wb, ws, '期初库存'); + + const colWidths = [ + { wch: 15 }, + { wch: 25 }, + { wch: 10 }, + { wch: 8 }, + { wch: 10 }, + { wch: 20 }, + { wch: 15 }, + { wch: 30 }, + { wch: 18 } + ]; + ws['!cols'] = colWidths; + + const timestamp = new Date().toISOString().slice(0, 19).replace(/:/g, '-'); + const filename = `期初库存_选中${exportData.length}条_${timestamp}.xlsx`; + + XLSX.writeFile(wb, filename); + + console.log(`成功导出 ${exportData.length} 条数据到 ${filename}`); + + } catch (err) { + console.error('导出失败:', err); + alert('导出失败: ' + err.message); + } + } + + async function exportByFactory() { + try { + document.getElementById('export-menu').style.display = 'none'; + + const factory = document.getElementById('factory-filter')?.value || ''; + + if (!factory) { + alert('请先选择要导出的工厂'); + return; + } + + const factoryData = stockList.filter(item => item.factory === factory); + + if (factoryData.length === 0) { + alert(`工厂 "${factory}" 没有数据可导出`); + return; + } + + await ensureXLSXLoaded(); + + const exportData = factoryData.map(item => ({ + '物料编码': item.material_code || '', + '物料名称': item.material_name || '', + '库存数量': item.stock_qty || 0, + '单位': item.unit || 'pcs', + '最小包装': item.min_package || 1, + '供应商': item.supplier || '', + '工厂': item.factory || '', + '备注': item.remark || '', + '更新时间': formatTime(item.updated_at) + })); + + const ws = XLSX.utils.json_to_sheet(exportData); + const wb = XLSX.utils.book_new(); + XLSX.utils.book_append_sheet(wb, ws, '期初库存'); + + const colWidths = [ + { wch: 15 }, + { wch: 25 }, + { wch: 10 }, + { wch: 8 }, + { wch: 10 }, + { wch: 20 }, + { wch: 15 }, + { wch: 30 }, + { wch: 18 } + ]; + ws['!cols'] = colWidths; + + const timestamp = new Date().toISOString().slice(0, 19).replace(/:/g, '-'); + const filename = `期初库存_${factory}_${timestamp}.xlsx`; + + XLSX.writeFile(wb, filename); + + console.log(`成功导出 ${exportData.length} 条数据到 ${filename}`); + + } catch (err) { + console.error('导出失败:', err); + alert('导出失败: ' + err.message); + } + } + async function showRestoreDialog() { document.getElementById('restore-modal').style.display = 'flex'; await loadBackupList(); @@ -777,6 +996,10 @@ importExcel, closeRestoreModal, restoreBackup, - deleteBackup + deleteBackup, + toggleExportMenu, + exportAll, + exportSelected, + exportByFactory }; })(); diff --git a/frontend/js/components/shipment-query.js b/frontend/js/components/shipment-query.js index bfd4dbd..52d7d35 100755 --- a/frontend/js/components/shipment-query.js +++ b/frontend/js/components/shipment-query.js @@ -91,6 +91,8 @@ Router.register('/shipments/query', async () => {
机种: ${data.platform_name || '未知'}
出货日期: ${data.date}
箱号: ${data.box}
+ ${data.emmc ? `
EMMC: ${data.emmc}
` : ''} + ${data.ddr ? `
DDR: ${data.ddr}
` : ''}
记录时间: ${data.ts}
`; @@ -117,6 +119,8 @@ Router.register('/shipments/query', async () => {
SN/MAC: ${record.sn}
机种: ${record.platform_name || '未知'}
出货日期: ${record.date}
+ ${record.emmc ? `
EMMC: ${record.emmc}
` : ''} + ${record.ddr ? `
DDR: ${record.ddr}
` : ''}
记录时间: ${record.ts}
`).join(''); diff --git a/frontend/js/components/shipment-summary.js b/frontend/js/components/shipment-summary.js index a936712..23dd986 100755 --- a/frontend/js/components/shipment-summary.js +++ b/frontend/js/components/shipment-summary.js @@ -1,6 +1,7 @@ Router.register('/shipments/summary', async () => { setTimeout(async () => { const queryBtn = document.getElementById('summary-query-btn'); + const exportBtn = document.getElementById('summary-export-btn'); const startDateInput = document.getElementById('start-date'); const endDateInput = document.getElementById('end-date'); const resultDiv = document.getElementById('summary-result'); @@ -89,7 +90,63 @@ Router.register('/shipments/summary', async () => { } }; + const performExport = async () => { + const startDate = startDateInput?.value; + const endDate = endDateInput?.value; + + if (!startDate || !endDate) { + alert('请选择开始和结束日期'); + return; + } + + try { + exportBtn.disabled = true; + exportBtn.textContent = '导出中...'; + + const url = `/api/shipments/export?start=${encodeURIComponent(startDate)}&end=${encodeURIComponent(endDate)}`; + + // 使用 fetch 下载文件 + const res = await fetch(url, { + credentials: 'include' + }); + + if (!res.ok) { + const error = await res.json(); + throw new Error(error.error || '导出失败'); + } + + // 获取文件名 + const contentDisposition = res.headers.get('Content-Disposition'); + let filename = `发货记录_${startDate}_至_${endDate}.xlsx`; + if (contentDisposition) { + const matches = /filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/.exec(contentDisposition); + if (matches && matches[1]) { + filename = matches[1].replace(/['"]/g, ''); + } + } + + // 下载文件 + const blob = await res.blob(); + const downloadUrl = window.URL.createObjectURL(blob); + const a = document.createElement('a'); + a.href = downloadUrl; + a.download = filename; + document.body.appendChild(a); + a.click(); + window.URL.revokeObjectURL(downloadUrl); + document.body.removeChild(a); + + alert('导出成功!'); + } catch (e) { + alert('导出失败:' + e.message); + } finally { + exportBtn.disabled = false; + exportBtn.textContent = '导出Excel'; + } + }; + queryBtn?.addEventListener('click', performQuery); + exportBtn?.addEventListener('click', performExport); // 自动执行一次查询 performQuery(); @@ -163,8 +220,9 @@ Router.register('/shipments/summary', async () => { -
+
+
diff --git a/frontend/js/components/shipments.js b/frontend/js/components/shipments.js index f47c02c..d0cb667 100755 --- a/frontend/js/components/shipments.js +++ b/frontend/js/components/shipments.js @@ -1,6 +1,108 @@ Router.register('/upload/shipments', async () => { setTimeout(() => { const manualStatus = document.getElementById('ship-manual-status'); + const defaultPlatformNameMap = {pdd: '拼多多', yt: '圆通', tx: '兔喜', mt: '美团', drf: '大润发', std: '标准版'}; + + const renderPlatformOptions = (selectEl, list, selectedValue = '') => { + if (!selectEl) return; + const optsHtml = [ + '', + ...(list || []).map(o => ``) + ].join(''); + selectEl.innerHTML = optsHtml; + if (selectedValue) selectEl.value = selectedValue; + }; + + const loadPlatforms = async (selectedManual = '', selectedImport = '') => { + try { + const res = await API.listShipmentPlatforms(); + const list = (res && res.list) ? res.list : []; + renderPlatformOptions(document.getElementById('ship-manual-platform'), list, selectedManual); + renderPlatformOptions(document.getElementById('ship-platform'), list, selectedImport); + } catch (e) { + // 失败时不阻塞页面,保持当前 options(可能是旧的静态内容) + console.warn('加载机种列表失败:', e); + } + }; + + const showManageModal = async () => { + let list = []; + try { + const res = await API.listShipmentPlatforms(); + list = (res && res.list) ? res.list : []; + } catch (e) { + API.toast('加载机种失败'); + return; + } + + const custom = list.filter(x => !x.is_default); + const modal = document.createElement('div'); + modal.id = 'ship-platform-manage-modal'; + modal.style.cssText = 'position:fixed;inset:0;background:rgba(0,0,0,0.5);z-index:1000;display:flex;align-items:center;justify-content:center;padding:20px'; + modal.innerHTML = ` +
+
+
机种管理(仅自定义可删除)
+ +
+
+ ${custom.length ? ` +
共 ${custom.length} 个自定义机种
+
    + ${custom.map(x => ` +
  • +
    +
    ${x.label}
    +
    ${x.value}
    +
    + +
  • + `).join('')} +
+ ` : ` +
暂无自定义机种
+ `} +
+
+ +
+
+ `; + document.body.appendChild(modal); + + const close = () => modal.remove(); + modal.addEventListener('click', (e) => { if (e.target === modal) close(); }); + modal.querySelector('#ship-platform-manage-close')?.addEventListener('click', close); + + modal.querySelector('#ship-platform-manage-add')?.addEventListener('click', async () => { + const name = (prompt('请输入自定义机种名称') || '').trim(); + if (!name) return; + try { + const added = await API.addShipmentPlatform(name); + if (added && added.ok) { + API.toast('已添加机种:' + (added.label || name)); + close(); + await loadPlatforms(added.value, added.value); + } + } catch (e) {} + }); + + modal.querySelectorAll('.ship-platform-delete').forEach(btn => { + btn.addEventListener('click', async () => { + const code = btn.dataset.code; + const label = btn.closest('li')?.querySelector('div div')?.textContent || code; + if (!confirm(`确定删除自定义机种:${label}?\n\n删除后下拉将不再显示该机种。`)) return; + try { + const r = await API.deleteShipmentPlatform(code); + if (r && r.ok) { + API.toast('删除成功'); + close(); + await loadPlatforms(); + } + } catch (e) {} + }); + }); + }; // 设置默认日期为今天 const dateInput = document.getElementById('ship-date'); @@ -8,6 +110,11 @@ Router.register('/upload/shipments', async () => { const today = new Date().toISOString().split('T')[0]; dateInput.value = today; } + + // 动态加载机种下拉,并支持自定义新增 + loadPlatforms(); + + document.getElementById('ship-manage-platforms')?.addEventListener('click', showManageModal); // 手动录入提交 const btn = document.getElementById('ship-upload'); @@ -54,7 +161,7 @@ Router.register('/upload/shipments', async () => { await API.uploadShipments(payload); - const platformName = {pdd: '拼多多', yt: '圆通', tx: '兔喜', mt: '美团', drf: '大润发', std: '标准版'}[platform] || platform; + const platformName = defaultPlatformNameMap[platform] || platform; manualStatus.textContent = `✓ 录入成功!机种:${platformName},数量:${qty}`; manualStatus.className = 'success'; @@ -155,7 +262,7 @@ Router.register('/upload/shipments', async () => { const data = await res.json(); if (data.ok) { - const platformName = {pdd: '拼多多', yt: '圆通', tx: '兔喜', mt: '美团', drf: '大润发', std: '标准版'}[platform] || platform; + const platformName = defaultPlatformNameMap[platform] || platform; fileStatus.textContent = `✓ 上传成功!机种:${platformName},共导入${data.count}个箱次,${data.total_qty}个SN`; fileStatus.className = 'success'; fileInput.value = ''; @@ -234,6 +341,9 @@ Router.register('/upload/shipments', async () => {
diff --git a/server/app.py b/server/app.py index 95386ab..c67aa48 100755 --- a/server/app.py +++ b/server/app.py @@ -19,6 +19,16 @@ BASE_DIR = os.path.dirname(os.path.abspath(__file__)) DB_PATH = os.path.join(BASE_DIR, 'data.db') FRONTEND_DIR = os.path.join(os.path.dirname(BASE_DIR), 'frontend') +# 发货机种(默认选项 + 自定义表) +DEFAULT_SHIPMENT_PLATFORMS = { + 'pdd': '拼多多', + 'yt': '圆通', + 'tx': '兔喜', + 'mt': '美团', + 'drf': '大润发', + 'std': '标准版', +} + app = Flask(__name__, static_folder=FRONTEND_DIR, static_url_path='') app.config['SECRET_KEY'] = os.environ.get('APP_SECRET', 'change-me') app.config['MAX_CONTENT_LENGTH'] = 50 * 1024 * 1024 # 限制上传文件大小为50MB @@ -110,6 +120,25 @@ def init_db(): date TEXT, qty INTEGER, receiver TEXT, + ts TEXT, + emmc TEXT, + ddr TEXT + )''') + # 为已存在的表添加 emmc 和 ddr 列(如果不存在) + try: + c.execute('ALTER TABLE shipments ADD COLUMN emmc TEXT') + except: + pass + try: + c.execute('ALTER TABLE shipments ADD COLUMN ddr TEXT') + except: + pass + + # 发货机种类型(自定义项) + c.execute('''CREATE TABLE IF NOT EXISTS shipment_platforms( + id INTEGER PRIMARY KEY AUTOINCREMENT, + code TEXT UNIQUE NOT NULL, + name TEXT NOT NULL, ts TEXT )''') c.execute('''CREATE TABLE IF NOT EXISTS devices( @@ -917,6 +946,49 @@ def upload_avatar(): c.execute('UPDATE users SET avatar=? WHERE id=?', (avatar_url, uid)) conn.commit() conn.close() + + +def _make_platform_code(): + """生成一个短且稳定可用的机种 code(避免与默认 code 冲突)""" + # 12位随机 hex 足够用且不会太长 + import secrets + return 'cust_' + secrets.token_hex(6) + + +def list_shipment_platforms(): + """返回发货机种选项(包含默认 + 自定义)""" + opts = [{'code': k, 'name': v, 'is_default': True} for k, v in DEFAULT_SHIPMENT_PLATFORMS.items()] + try: + conn = get_db() + c = conn.cursor() + c.execute('SELECT code, name FROM shipment_platforms ORDER BY id DESC') + rows = [dict(r) for r in c.fetchall()] + conn.close() + # 自定义排在后面,防止覆盖默认同 code(理论上不会发生) + for r in rows: + opts.append({'code': r['code'], 'name': r['name'], 'is_default': False}) + except Exception: + pass + return opts + + +def shipment_platform_display_name(code): + """将 platform code 映射为展示名称(默认映射 + 自定义表)""" + if not code: + return '' + if code in DEFAULT_SHIPMENT_PLATFORMS: + return DEFAULT_SHIPMENT_PLATFORMS[code] + try: + conn = get_db() + c = conn.cursor() + c.execute('SELECT name FROM shipment_platforms WHERE code=?', (code,)) + row = c.fetchone() + conn.close() + if row and row['name']: + return row['name'] + except Exception: + pass + return code log('upload_avatar', f'上传头像: {new_filename}') return jsonify({'ok': True, 'avatar_url': avatar_url}) @@ -2688,7 +2760,7 @@ def upload_shipments(): conn.commit() conn.close() - platform_name = {'pdd': '拼多多', 'yt': '圆通', 'tx': '兔喜', 'mt': '美团', 'drf': '大润发', 'std': '标准版'}.get(platform, platform) + platform_name = shipment_platform_display_name(platform) log_data = {'date': date, 'qty': qty, 'to': to, 'platform': platform} if box_no: log_data['box_no'] = box_no @@ -2698,6 +2770,91 @@ def upload_shipments(): return jsonify({'ok': True}) +@app.get('/api/shipments/platforms') +@require_login +def get_shipment_platforms(): + """获取发货机种选项(默认 + 自定义)""" + opts = list_shipment_platforms() + # 前端需要统一格式 + return jsonify({'list': [{'value': o['code'], 'label': o['name'], 'is_default': o['is_default']} for o in opts]}) + + +@app.post('/api/shipments/platforms') +@require_login +@require_any_role('admin','superadmin') +def add_shipment_platform(): + """添加自定义发货机种""" + data = request.get_json() or {} + name = (data.get('name') or '').strip() + if not name: + return jsonify({'error': 'invalid payload'}), 400 + if len(name) > 50: + return jsonify({'error': '机种名称过长'}), 400 + + # 若与默认名称完全一致,直接返回默认项 + for code, label in DEFAULT_SHIPMENT_PLATFORMS.items(): + if label == name: + return jsonify({'ok': True, 'value': code, 'label': label, 'is_default': True}) + + conn = get_db() + c = conn.cursor() + try: + # 若已存在同名自定义项,直接返回已有 code + c.execute('SELECT code, name FROM shipment_platforms WHERE name=?', (name,)) + row = c.fetchone() + if row: + conn.close() + return jsonify({'ok': True, 'value': row['code'], 'label': row['name'], 'is_default': False}) + + code = _make_platform_code() + c.execute('INSERT INTO shipment_platforms(code, name, ts) VALUES(?,?,?)', (code, name, get_beijing_time())) + conn.commit() + conn.close() + log('add_shipment_platform', json.dumps({'code': code, 'name': name})) + notify_superadmin('新增发货机种', f"机种: {name}({code})") + return jsonify({'ok': True, 'value': code, 'label': name, 'is_default': False}) + except Exception as e: + try: + conn.close() + except Exception: + pass + return jsonify({'error': str(e)}), 500 + + +@app.delete('/api/shipments/platforms/') +@require_login +@require_any_role('admin','superadmin') +def delete_shipment_platform(code): + """删除自定义发货机种(默认机种不可删除)""" + code = (code or '').strip() + if not code: + return jsonify({'error': 'invalid payload'}), 400 + if code in DEFAULT_SHIPMENT_PLATFORMS: + return jsonify({'error': '默认机种不可删除'}), 400 + + conn = get_db() + c = conn.cursor() + try: + c.execute('SELECT id, name FROM shipment_platforms WHERE code=?', (code,)) + row = c.fetchone() + if not row: + conn.close() + return jsonify({'ok': True, 'deleted': 0}) + + c.execute('DELETE FROM shipment_platforms WHERE code=?', (code,)) + conn.commit() + conn.close() + log('delete_shipment_platform', json.dumps({'code': code, 'name': row['name']})) + notify_superadmin('删除发货机种', f"机种: {row['name']}({code})") + return jsonify({'ok': True, 'deleted': 1}) + except Exception as e: + try: + conn.close() + except Exception: + pass + return jsonify({'error': str(e)}), 500 + + # collect @app.get('/api/collect/devices') @require_login @@ -3764,7 +3921,7 @@ def query_shipment_by_sn(): # 解析 JSON 数据 shipment_info = json.loads(result) platform = shipment_info.get('platform', 'pdd') # 默认拼多多 - platform_name = {'pdd': '拼多多', 'yt': '圆通', 'tx': '兔喜', 'mt': '美团', 'drf': '大润发', 'std': '标准版'}.get(platform, platform) + platform_name = shipment_platform_display_name(platform) return jsonify({ 'found': True, 'sn': sn, @@ -3772,7 +3929,9 @@ def query_shipment_by_sn(): 'box': shipment_info.get('box'), 'platform': platform, 'platform_name': platform_name, - 'ts': shipment_info.get('ts') + 'ts': shipment_info.get('ts'), + 'emmc': shipment_info.get('emmc', ''), + 'ddr': shipment_info.get('ddr', '') }) else: return jsonify({ @@ -3809,14 +3968,16 @@ def query_shipment_by_box(): shipment_info = json.loads(data) if shipment_info.get('box') == box_no: platform = shipment_info.get('platform', 'pdd') - platform_name = {'pdd': '拼多多', 'yt': '圆通', 'tx': '兔喜', 'mt': '美团', 'drf': '大润发', 'std': '标准版'}.get(platform, platform) + platform_name = shipment_platform_display_name(platform) matched_records.append({ 'sn': sn.decode('utf-8') if isinstance(sn, bytes) else sn, 'date': shipment_info.get('date'), 'box': shipment_info.get('box'), 'platform': platform, 'platform_name': platform_name, - 'ts': shipment_info.get('ts') + 'ts': shipment_info.get('ts'), + 'emmc': shipment_info.get('emmc', ''), + 'ddr': shipment_info.get('ddr', '') }) except: continue @@ -4022,6 +4183,130 @@ def clear_shipments_redis(): return jsonify({'error': f'清空失败:{str(e)}'}), 500 +@app.get('/api/shipments/export') +@require_login +def export_shipments(): + """导出发货记录为Excel文件""" + try: + start_date = request.args.get('start') + end_date = request.args.get('end') + + if not start_date or not end_date: + return jsonify({'error': '请提供开始和结束日期'}), 400 + + import openpyxl + from openpyxl.styles import Font, Alignment, PatternFill + import json + + conn = get_db() + c = conn.cursor() + + # 查询指定日期范围内的发货记录(按箱号分组) + c.execute(''' + SELECT id, date, receiver, emmc, ddr, ts + FROM shipments + WHERE date >= ? AND date <= ? + ORDER BY date, id + ''', (start_date, end_date)) + + records = [dict(r) for r in c.fetchall()] + conn.close() + + if not records: + return jsonify({'error': '该时间段内没有发货记录'}), 404 + + # 从 Redis 获取 SN 数据 + try: + r = get_redis() + redis_key = 'shipment_sn_mapping' + all_sn_data = r.hgetall(redis_key) + except: + all_sn_data = {} + + # 创建 Excel 工作簿 + wb = openpyxl.Workbook() + ws = wb.active + ws.title = '发货记录' + + # 设置表头样式 + header_fill = PatternFill(start_color='4472C4', end_color='4472C4', fill_type='solid') + header_font = Font(bold=True, color='FFFFFF') + header_alignment = Alignment(horizontal='center', vertical='center') + + # 创建表头 + headers = ['出货日期', '箱号'] + [f'SN{i}' for i in range(1, 21)] + ['EMMC', 'DDR'] + for col_idx, header in enumerate(headers, 1): + cell = ws.cell(row=1, column=col_idx, value=header) + cell.fill = header_fill + cell.font = header_font + cell.alignment = header_alignment + + # 填充数据 + row_idx = 2 + for record in records: + # 提取箱号 + receiver = record['receiver'] or '' + box_no = receiver.replace('箱号:', '').strip() + + # 从 Redis 获取该箱号的所有 SN + sns = [] + for sn, data in all_sn_data.items(): + try: + sn_str = sn.decode('utf-8') if isinstance(sn, bytes) else sn + data_str = data.decode('utf-8') if isinstance(data, bytes) else data + info = json.loads(data_str) + if info.get('box') == box_no: + sns.append(sn_str) + except: + continue + + # 写入数据行 + ws.cell(row=row_idx, column=1, value=record['date']) + ws.cell(row=row_idx, column=2, value=box_no) + + # 写入 SN(最多20个) + for i, sn in enumerate(sns[:20], 3): + ws.cell(row=row_idx, column=i, value=sn) + + # 写入 EMMC 和 DDR + ws.cell(row=row_idx, column=23, value=record.get('emmc', '')) + ws.cell(row=row_idx, column=24, value=record.get('ddr', '')) + + row_idx += 1 + + # 调整列宽 + ws.column_dimensions['A'].width = 12 # 出货日期 + ws.column_dimensions['B'].width = 20 # 箱号 + for i in range(3, 23): # SN1-SN20 + ws.column_dimensions[openpyxl.utils.get_column_letter(i)].width = 25 + ws.column_dimensions['W'].width = 10 # EMMC + ws.column_dimensions['X'].width = 10 # DDR + + # 保存到内存 + from io import BytesIO + output = BytesIO() + wb.save(output) + output.seek(0) + + # 生成文件名 + filename = f'发货记录_{start_date}_至_{end_date}.xlsx' + + log('export_shipments', f'start={start_date}, end={end_date}, records={len(records)}') + + return send_file( + output, + mimetype='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', + as_attachment=True, + download_name=filename + ) + + except Exception as e: + log('export_shipments_error', str(e)) + import traceback + traceback.print_exc() + return jsonify({'error': f'导出失败:{str(e)}'}), 500 + + @app.route('/api/upload/shipments-file', methods=['POST']) @require_login @require_any_role('admin','superadmin') @@ -4033,8 +4318,9 @@ def upload_shipments_file(): if not f: return jsonify({'error': '请选择文件'}), 400 - if not platform or platform not in ['pdd', 'yt', 'tx']: - return jsonify({'error': '请选择机种(拼多多/圆通/兔喜)'}), 400 + allowed = set([o['code'] for o in list_shipment_platforms()]) + if not platform or platform not in allowed: + return jsonify({'error': '请选择有效的机种类型(可在下拉中新增自定义机种)'}), 400 name = secure_filename(f.filename or '') ext = (name.split('.')[-1] or '').lower() @@ -4056,6 +4342,8 @@ def upload_shipments_file(): # 找到列索引 date_idx = next((i for i, h in enumerate(header) if '出货日期' in h or '发货日期' in h or 'date' in header_lower[i]), None) box_idx = next((i for i, h in enumerate(header) if '箱号' in h or 'box' in header_lower[i]), None) + emmc_idx = next((i for i, h in enumerate(header) if 'emmc' in h.lower()), None) + ddr_idx = next((i for i, h in enumerate(header) if 'ddr' in h.lower()), None) if date_idx is None or box_idx is None: return jsonify({'error': '缺少必需的列'}), 400 @@ -4064,8 +4352,10 @@ def upload_shipments_file(): sn_cols = [(i, h) for i, h in enumerate(header) if h.startswith('SN') and h[2:].isdigit()] sn_indices = sorted(sn_cols, key=lambda x: int(x[1][2:])) # 按 SN 后面的数字排序 - # 记录上一个有效的日期(用于处理合并单元格) + # 记录上一个有效的日期、EMMC、DDR(用于处理合并单元格) last_valid_date = None + last_valid_emmc = None + last_valid_ddr = None for line in lines[1:]: parts = [p.strip() for p in line.split(',')] @@ -4085,6 +4375,22 @@ def upload_shipments_file(): # 处理箱号 box = parts[box_idx] if box_idx < len(parts) and parts[box_idx] else '' + # 处理 EMMC(支持合并单元格) + current_emmc = parts[emmc_idx] if emmc_idx is not None and emmc_idx < len(parts) and parts[emmc_idx] else '' + if current_emmc: + last_valid_emmc = current_emmc + emmc = current_emmc + else: + emmc = last_valid_emmc or '' + + # 处理 DDR(支持合并单元格) + current_ddr = parts[ddr_idx] if ddr_idx is not None and ddr_idx < len(parts) and parts[ddr_idx] else '' + if current_ddr: + last_valid_ddr = current_ddr + ddr = current_ddr + else: + ddr = last_valid_ddr or '' + # 如果没有日期或箱号,跳过这行 if not date or not box: continue @@ -4101,7 +4407,9 @@ def upload_shipments_file(): 'date': date, 'box': box, 'sns': sns, - 'qty': len(sns) + 'qty': len(sns), + 'emmc': emmc, + 'ddr': ddr }) else: import openpyxl @@ -4120,6 +4428,8 @@ def upload_shipments_file(): # 找到列索引 date_idx = next((i for i, h in enumerate(header) if '出货日期' in h or '发货日期' in h or 'date' in header_lower[i]), None) box_idx = next((i for i, h in enumerate(header) if '箱号' in h or 'box' in header_lower[i]), None) + emmc_idx = next((i for i, h in enumerate(header) if 'emmc' in h.lower()), None) + ddr_idx = next((i for i, h in enumerate(header) if 'ddr' in h.lower()), None) if date_idx is None or box_idx is None: wb.close() @@ -4129,8 +4439,10 @@ def upload_shipments_file(): sn_cols = [(i, h) for i, h in enumerate(header) if h.startswith('SN') and h[2:].isdigit()] sn_indices = sorted(sn_cols, key=lambda x: int(x[1][2:])) # 按 SN 后面的数字排序 - # 记录上一个有效的日期(用于处理合并单元格) + # 记录上一个有效的日期、EMMC、DDR(用于处理合并单元格) last_valid_date = None + last_valid_emmc = None + last_valid_ddr = None # 读取数据行 for row in ws.iter_rows(min_row=2, values_only=True): @@ -4168,6 +4480,24 @@ def upload_shipments_file(): # 处理箱号 box = str(row[box_idx]).strip() if box_idx < len(row) and row[box_idx] else '' + # 处理 EMMC(支持合并单元格) + emmc_value = row[emmc_idx] if emmc_idx is not None and emmc_idx < len(row) else None + current_emmc = str(emmc_value).strip() if emmc_value and str(emmc_value) != 'None' else '' + if current_emmc: + last_valid_emmc = current_emmc + emmc = current_emmc + else: + emmc = last_valid_emmc or '' + + # 处理 DDR(支持合并单元格) + ddr_value = row[ddr_idx] if ddr_idx is not None and ddr_idx < len(row) else None + current_ddr = str(ddr_value).strip() if ddr_value and str(ddr_value) != 'None' else '' + if current_ddr: + last_valid_ddr = current_ddr + ddr = current_ddr + else: + ddr = last_valid_ddr or '' + # 如果没有日期或箱号,跳过这行 if not date or not box or box == 'None': continue @@ -4186,7 +4516,9 @@ def upload_shipments_file(): 'date': date, 'box': box, 'sns': sns, - 'qty': len(sns) + 'qty': len(sns), + 'emmc': emmc, + 'ddr': ddr }) wb.close() @@ -4202,8 +4534,10 @@ def upload_shipments_file(): total_qty = 0 for r in rows: receiver_info = f"箱号:{r['box']}" - c.execute('INSERT INTO shipments(date, qty, receiver, ts) VALUES(?,?,?,?)', - (r['date'], r['qty'], receiver_info, now)) + emmc_value = r.get('emmc', '') + ddr_value = r.get('ddr', '') + c.execute('INSERT INTO shipments(date, qty, receiver, ts, emmc, ddr) VALUES(?,?,?,?,?,?)', + (r['date'], r['qty'], receiver_info, now, emmc_value, ddr_value)) total_qty += r['qty'] conn.commit() @@ -4224,14 +4558,18 @@ def upload_shipments_file(): sns = row_data['sns'] # 为每个 SN/MAC 创建映射记录 + emmc = row_data.get('emmc', '') + ddr = row_data.get('ddr', '') for sn in sns: if sn: # 确保 SN 不为空 - # 存储格式: MAC -> JSON(date, box, platform, timestamp) + # 存储格式: MAC -> JSON(date, box, platform, timestamp, emmc, ddr) shipment_info = json.dumps({ 'date': date, 'box': box, 'platform': platform, - 'ts': now + 'ts': now, + 'emmc': emmc, + 'ddr': ddr }, ensure_ascii=False) pipe.hset(redis_key, sn, shipment_info) redis_count += 1 diff --git a/server/data.db b/server/data.db index c39f937b7a26525362afdd9657cf0af32eea59f1..6555a205491a06248da53205d6676613e6ff5083 100644 GIT binary patch delta 205795 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

rkOdc|wTZ--_`pe)-jpfdq&X;ALA0KT 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