
系统概述本系统是一款面向餐饮、食品加工及仓储管理等行业的食材验收管理软件旨在简化食材入库验收流程提高验收数据的准确性和完整性实现对食材来源、批次、价格及称重拍照等环节的有效监控与管理。系统基于Java/Android技术开发支持Windows和Android平板双平台运行通过串口通信获取电子秤重量数据并通过USB摄像头拍照实现验收过程的智能化。所有验收记录本地存储并支持灵活的查询与导出。主要功能模块1. 数据上传模块功能描述用户可通过系统界面上传包含单位、食材名称、批次、价格等字段的.xlsx文件。系统校验文件格式与字段完整性自动提示缺失或错误项。上传完成后系统将解析数据并加载到内置数据库供后续验收使用。核心流程点击“导入数据”按钮弹出文件选择对话框。选择.xlsx文件并确认。系统读取并校验字段单位供应商或部门名称食材名称字典匹配或手动补全批次日期流水号格式 价格单价支持小数校验通过后显示导入成功记录数否则高亮提示异常行并给出修改建议。2. 系统登录模块功能描述采用用户名密码的身份认证机制保证验收数据安全。支持管理员与普通操作员两级权限分别管理数据导入、设备配置、查询导出等权限。核心流程启动程序进入登录页面 2. 输入用户名、密码后点击“登录”。3. 系统校验账号信息校验通过后进入主界面否则给出失败提示。超过连续三次错误登录将锁定账户需管理员解锁。3. 验收称重与拍照模块功能描述在进行食材验收时用户可选择对应的单位及食材名称系统通过串口自动读取电子秤的数据并通过USB摄像头对当前食材拍照。称重与拍照结果实时显示在界面并可在记录中查看。核心流程在主界面点击“开始验收”。\n 2. 从下拉列表中选择供应单位和食材名称。\n 3. 点击“读取重量”系统通过串口如/dev/ttyZC3获取电子秤重量值并显示在文本框中。\n 4. 点击“拍照”系统调用USB摄像头拍摄食材照片并自动保存图像文件。\n 5. 点击“保存记录”将本次验收数据单位、食材、批次、重量、价格、照片路径、验收时间写入本地数据库。4. 本地存储与查询导出模块功能描述系统将所有验收记录保存在本地SQLite数据库中并提供强大的查询与导出功能支持按时间、单位、食材等多维度筛选。查询结果可导出为.xlsx或.csv格式便于后续统计分析与归档。核心流程在主界面切换至“查询导出”页面。2. 通过输入框或筛选条件选择时间范围、单位、食材名称等。3. 点击“查询”按钮系统展示符合条件的记录列表支持分页和排序。 4. 点击“导出”按钮弹出导出对话框选择导出格式.xlsx/.csv并指定保存路径。5. 导出完成后提示文件保存位置。系统优势自动化程度高无须手动录入重量和拍照减少人为误差。流程可追溯每条验收记录包含完整的时间戳、操作员信息及图像证据便于质量追踪。易于集成基于标准串口和USB摄像头适配市面主流电子秤与摄像头设备。数据安全可靠本地存储结合权限管理保证数据完整性与安全性。欢迎使用本系统全面提升食材验收效率确保食材质量安全示例代码!DOCTYPE html html langzh-CN head meta charsetUTF-8 meta nameviewport contentwidthdevice-width, initial-scale1.0 title智能扫码称重管理系统/title style * { margin: 0; padding: 0; box-sizing: border-box; } body { font-family: Segoe UI, Tahoma, Geneva, Verdana, sans-serif; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); min-height: 100vh; display: flex; flex-direction: column; color: #333; } .header { background: rgba(255, 255, 255, 0.95); backdrop-filter: blur(10px); padding: 20px; text-align: center; box-shadow: 0 4px 30px rgba(0, 0, 0, 0.1); border-bottom: 1px solid rgba(255, 255, 255, 0.3); } .header h1 { font-size: 2.5rem; font-weight: 700; background: linear-gradient(45deg, #667eea, #764ba2); background-clip: text; -webkit-background-clip: text; -webkit-text-fill-color: transparent; margin-bottom: 8px; } .header p { font-size: 1.1rem; color: #666; font-weight: 300; } .container { flex: 1; display: grid; grid-template-columns: 1fr 1fr; gap: 30px; padding: 30px; max-width: 1400px; margin: 0 auto; width: 100%; } .card { background: rgba(255, 255, 255, 0.95); backdrop-filter: blur(15px); border-radius: 20px; padding: 30px; box-shadow: 0 20px 40px rgba(0, 0, 0, 0.1); border: 1px solid rgba(255, 255, 255, 0.3); transition: all 0.3s ease; position: relative; overflow: hidden; } .card::before { content: ; position: absolute; top: 0; left: 0; right: 0; height: 4px; background: linear-gradient(90deg, #667eea, #764ba2); } .card:hover { transform: translateY(-5px); box-shadow: 0 25px 50px rgba(0, 0, 0, 0.15); } .card-title { font-size: 1.5rem; font-weight: 600; margin-bottom: 20px; color: #333; display: flex; align-items: center; gap: 10px; } .scan-area { text-align: center; padding: 40px 20px; border: 3px dashed #ddd; border-radius: 15px; background: linear-gradient(145deg, #f8f9ff, #e8f0ff); transition: all 0.3s ease; cursor: pointer; margin-bottom: 20px; } .scan-area:hover { border-color: #667eea; background: linear-gradient(145deg, #f0f4ff, #e0ebff); transform: scale(1.02); } .scan-icon { width: 80px; height: 80px; margin: 0 auto 20px; background: linear-gradient(45deg, #667eea, #764ba2); border-radius: 50%; display: flex; align-items: center; justify-content: center; color: white; font-size: 2.5rem; } .scan-text { font-size: 1.2rem; color: #666; margin-bottom: 10px; } .scan-hint { font-size: 0.9rem; color: #999; } .qr-info { display: none; animation: fadeInUp 0.5s ease; } .qr-info.active { display: block; } .info-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 15px; margin-top: 20px; } .info-item { background: #f8f9ff; padding: 15px; border-radius: 10px; border-left: 4px solid #667eea; } .info-label { font-size: 0.9rem; color: #666; margin-bottom: 5px; } .info-value { font-size: 1.1rem; font-weight: 600; color: #333; } .weight-display { text-align: center; } .weight-value { font-size: 4rem; font-weight: 700; color: #667eea; margin: 20px 0; text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.1); } .weight-unit { font-size: 1.5rem; color: #666; margin-left: 10px; } .weight-status { background: linear-gradient(45deg, #4CAF50, #45a049); color: white; padding: 10px 20px; border-radius: 25px; font-weight: 500; display: inline-block; margin-top: 10px; } .submit-section { grid-column: 1 / -1; text-align: center; } .submit-btn { background: linear-gradient(45deg, #667eea, #764ba2); color: white; border: none; padding: 18px 50px; font-size: 1.2rem; font-weight: 600; border-radius: 50px; cursor: pointer; transition: all 0.3s ease; box-shadow: 0 10px 30px rgba(102, 126, 234, 0.3); position: relative; overflow: hidden; } .submit-btn::before { content: ; position: absolute; top: 0; left: -100%; width: 100%; height: 100%; background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.2), transparent); transition: left 0.5s; } .submit-btn:hover::before { left: 100%; } .submit-btn:hover { transform: translateY(-2px); box-shadow: 0 15px 40px rgba(102, 126, 234, 0.4); } .submit-btn:disabled { background: #ccc; cursor: not-allowed; transform: none; box-shadow: none; } .status-indicator { display: flex; align-items: center; gap: 10px; margin-bottom: 15px; } .status-dot { width: 12px; height: 12px; border-radius: 50%; background: #ccc; transition: background 0.3s ease; } .status-dot.active { background: #4CAF50; box-shadow: 0 0 10px rgba(76, 175, 80, 0.5); } .status-text { font-size: 0.9rem; color: #666; } keyframes fadeInUp { from { opacity: 0; transform: translateY(20px); } to { opacity: 1; transform: translateY(0); } } keyframes pulse { 0%, 100% { transform: scale(1); } 50% { transform: scale(1.05); } } .scanning { animation: pulse 1.5s infinite; } media (max-width: 768px) { .container { grid-template-columns: 1fr; padding: 20px; } .header h1 { font-size: 2rem; } .weight-value { font-size: 3rem; } .info-grid { grid-template-columns: 1fr; } } /style /head body div classheader h1智能扫码称重管理系统/h1 p高效 · 精准 · 智能化管理/p /div div classcontainer !-- 扫码区域 -- div classcard h2 classcard-title 扫码识别 /h2 div classstatus-indicator div classstatus-dot idscanStatus/div span classstatus-text idscanStatusText等待扫码/span /div div classscan-area idscanArea onclicksimulateScan() div classscan-icon/div div classscan-text点击此处扫描二维码/div div classscan-hint支持各类二维码格式/div /div div classqr-info idqrInfo h3 stylemargin-bottom: 15px; color: #333; 产品信息/h3 div classinfo-grid div classinfo-item div classinfo-label棚号/div div classinfo-value idgreenhouse--/div /div div classinfo-item div classinfo-label品种/div div classinfo-value idvariety--/div /div div classinfo-item div classinfo-label姓名/div div classinfo-value idname--/div /div div classinfo-item div classinfo-label分类/div div classinfo-value idcategory--/div /div div classinfo-item stylegrid-column: 1 / -1; div classinfo-label地块信息/div div classinfo-value idlocation--/div /div /div /div /div !-- 重量显示区域 -- div classcard h2 classcard-title ⚖️ 重量检测 /h2 div classstatus-indicator div classstatus-dot idweightStatus/div span classstatus-text idweightStatusText串口连接中.../span /div div classweight-display div classweight-value idweightValue 0.00 span classweight-unitkg/span /div div classweight-status idweightStatusBadge准备就绪/div /div /div !-- 提交按钮 -- div classsubmit-section card h2 classcard-title 数据提交 /h2 button classsubmit-btn idsubmitBtn onclicksubmitData() disabled 提交数据到服务器 /button p stylemargin-top: 15px; color: #666; font-size: 0.9rem; 请确保已扫码并获取重量数据后再提交 /p /div /div script // 模拟数据 let qrData null; let currentWeight 0; let isScanned false; let isWeightReady false; // 模拟扫码功能 function simulateScan() { const scanArea document.getElementById(scanArea); const scanStatus document.getElementById(scanStatus); const scanStatusText document.getElementById(scanStatusText); scanArea.classList.add(scanning); scanStatus.classList.remove(active); scanStatusText.textContent 扫码中...; setTimeout(() { // 模拟扫码数据 qrData { greenhouse: A-001, variety: 西红柿, name: 张师傅, category: 一级品, location: 东区第3排第15号地块 }; displayQRInfo(qrData); scanArea.classList.remove(scanning); scanStatus.classList.add(active); scanStatusText.textContent 扫码成功; isScanned true; checkSubmitReady(); }, 2000); } // 显示二维码信息 function displayQRInfo(data) { document.getElementById(greenhouse).textContent data.greenhouse; document.getElementById(variety).textContent data.variety; document.getElementById(name).textContent data.name; document.getElementById(category).textContent data.category; document.getElementById(location).textContent data.location; const qrInfo document.getElementById(qrInfo); qrInfo.classList.add(active); } // 模拟串口重量数据 function simulateWeightData() { const weightValue document.getElementById(weightValue); const weightStatus document.getElementById(weightStatus); const weightStatusText document.getElementById(weightStatusText); const weightStatusBadge document.getElementById(weightStatusBadge); // 模拟重量变化 setInterval(() { currentWeight (Math.random() * 50 10).toFixed(2); weightValue.innerHTML currentWeight span classweight-unitkg/span; if (!isWeightReady) { weightStatus.classList.add(active); weightStatusText.textContent 重量稳定; weightStatusBadge.textContent 数据稳定; weightStatusBadge.style.background linear-gradient(45deg, #4CAF50, #45a049); isWeightReady true; checkSubmitReady(); } }, 1000); } // 检查是否可以提交 function checkSubmitReady() { const submitBtn document.getElementById(submitBtn); if (isScanned isWeightReady) { submitBtn.disabled false; submitBtn.style.background linear-gradient(45deg, #667eea, #764ba2); } } // 提交数据 function submitData() { if (!isScanned || !isWeightReady) { alert(请先扫码并获取重量数据); return; } const submitBtn document.getElementById(submitBtn); const originalText submitBtn.textContent; submitBtn.textContent 提交中...; submitBtn.disabled true; // 模拟提交过程 setTimeout(() { const submitData { ...qrData, weight: currentWeight, timestamp: new Date().toISOString() }; console.log(提交数据:, submitData); alert(数据提交成功\n JSON.stringify(submitData, null, 2)); submitBtn.textContent 提交成功 ✓; submitBtn.style.background linear-gradient(45deg, #4CAF50, #45a049); // 3秒后重置 setTimeout(() { resetForm(); }, 3000); }, 2000); } // 重置表单 function resetForm() { qrData null; currentWeight 0; isScanned false; isWeightReady false; document.getElementById(qrInfo).classList.remove(active); document.getElementById(scanStatus).classList.remove(active); document.getElementById(scanStatusText).textContent 等待扫码; document.getElementById(weightStatus).classList.remove(active); document.getElementById(weightStatusText).textContent 串口连接中...; document.getElementById(weightValue).innerHTML 0.00span classweight-unitkg/span; document.getElementById(weightStatusBadge).textContent 准备就绪; document.getElementById(weightStatusBadge).style.background linear-gradient(45deg, #4CAF50, #45a049); const submitBtn document.getElementById(submitBtn); submitBtn.textContent 提交数据到服务器; submitBtn.disabled true; submitBtn.style.background #ccc; } // 页面加载完成后开始模拟重量数据 window.addEventListener(load, () { setTimeout(() { simulateWeightData(); }, 1000); }); /script /body /html