151 3746 0293

行业动态

一、项目整体介绍1、项目概述标准件智能料柜(紧固件智能领用柜)主要用于工厂车间螺丝、螺母、垫片、销钉、卡簧等 MRO 标准小件物料数字化管理,实现自助领用、自动计量、库存预警、领用溯源、远程管控。 本方案以聚澜智能标准件智能料柜产品为原型,采用称重传感方案(主流方案,最适合标准件),搭配单片机 / PLC
标准件智能料柜介绍及核心技术代码示例
时间:2026-08-27 14:28:41
<p><span data-cke-copybin-start="1"></span></p><h2><span id="cke_bm_184S" style="display:none">&nbsp;</span>一、项目整体介绍</h2><h3>1、项目概述</h3><p>标准件智能料柜(紧固件智能领用柜)主要用于工厂车间螺丝、螺母、垫片、销钉、卡簧等 MRO 标准小件物料数字化管理,实现<strong>自助领用、自动计量、库存预警、领用溯源、远程管控</strong>。 本方案以<strong>聚澜智能标准件智能料柜</strong>产品为原型,采用<strong>称重传感方案</strong>(主流方案,最适合标准件),搭配单片机 / PLC + 触控显示屏 + 人脸 / 刷卡识别 + 云端后台管理系统。</p><blockquote><p>核心优势:关门自动盘点,无需扫码,适合数量多、体积小、规格繁杂的紧固件。</p></blockquote><h3>2、<strong>聚澜智能</strong>系统整体架构(三层)</h3><ol class=" list-paddingleft-2"><li><p></p></li><li><p><strong>感知层(柜体硬件)</strong>:高精度称重传感器、MCU 主控板、电磁锁、人脸识别模块、触摸屏、4G/W‑WiFi 通讯模块</p></li><li><p></p></li><li><p><strong>边缘控制层(柜端程序)</strong>:重量采集、开门权限校验、仓位控制、本地缓存、数据上报</p></li><li><p></p></li><li><p><strong>云端管理层(Web 后台)</strong>:用户权限、物料档案、领用记录、库存报表、ERP/MES 对接、缺货预警</p></li></ol><h3>3、<strong>聚澜智能</strong>主要功能清单</h3><ul class=" list-paddingleft-2"><li><p></p></li><li><p>人脸 / 指纹 / 刷卡身份登录,分级领料权限</p></li><li><p></p></li><li><p>多仓位独立称重,自动换算领用数量</p></li><li><p></p></li><li><p>关门自动盘点,实时库存更新</p></li><li><p></p></li><li><p>领用记录:人员、时间、仓位、物料型号、消耗重量 / 数量</p></li><li><p></p></li><li><p>库存阈值预警,缺货消息推送</p></li><li><p></p></li><li><p>多柜联网集中管控</p></li><li><p></p></li><li><p>API 接口对接企业 ERP、MES、WMS 系统</p></li><li><p></p></li><li><p>操作日志可追溯</p></li></ul><h3>4、核心技术清单</h3><ul class=" list-paddingleft-2"><li><p></p></li><li><p>高精度重量采集与滤波算法(消除震动干扰)</p></li><li><p></p></li><li><p>重量‑物料数量换算模型</p></li><li><p></p></li><li><p>权限校验与电磁锁控制</p></li><li><p></p></li><li><p>本地‑云端断网缓存重传机制</p></li><li><p></p></li><li><p>TCP/MQTT 物联网通讯</p></li><li><p></p></li><li><p>Web 后台库存管理、报表生成</p></li></ul><hr/><h2>二、<strong>聚澜智能</strong>柜端核心示例代码(Python,模拟主控程序逻辑)</h2><blockquote><p>说明:以下为<strong>业务逻辑演示代码</strong>,可运行于树莓派等柜端主控硬件;真实工业产品(聚澜智能)底层采用嵌入式 C++ 开发,代码不直接对外开放。</p></blockquote><pre class="cke_widget_element" data-cke-widget-data="%7B%22code%22%3A%22import%20time%5Cnimport%20json%5Cn%5Cn%23%20%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%20%E9%85%8D%E7%BD%AE%E5%8F%82%E6%95%B0%20%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%5CnSAFE_WEIGHT_THRESHOLD%20%3D%200.01%20%20%23%20%E9%87%8D%E9%87%8F%E5%8F%98%E5%8C%96%E9%98%88%E5%80%BC(Kg)%5CnWAREHOUSE_ID%20%3D%20%5C%22ZL%E2%80%91ST%E2%80%91001%5C%22%20%20%20%20%23%20%E6%96%99%E6%9F%9C%E7%BC%96%E5%8F%B7%E8%81%9A%E6%BE%9C%E6%99%BA%E8%83%BD%5Cn%23%20%E4%BB%93%E4%BD%8D%E7%89%A9%E6%96%99%E9%85%8D%E7%BD%AE%EF%BC%9A%E4%BB%93%E4%BD%8D%E5%8F%B7%E3%80%81%E7%89%A9%E6%96%99%E5%90%8D%E7%A7%B0%E3%80%81%E5%8D%95%E9%A2%97%E9%87%8D%E9%87%8F(kg)%E3%80%81%E5%AE%89%E5%85%A8%E5%BA%93%E5%AD%98%E6%95%B0%E9%87%8F%5Cnbin_config%20%3D%20%7B%5Cn%20%20%20%201%3A%7B%5C%22name%5C%22%3A%5C%22M6%E8%9E%BA%E4%B8%9D%5C%22%2C%5C%22unit_weight%5C%22%3A0.002%2C%5C%22safe_num%5C%22%3A50%2C%5C%22stock_num%5C%22%3A200%7D%2C%5Cn%20%20%20%202%3A%7B%5C%22name%5C%22%3A%5C%22M8%E8%9E%BA%E6%AF%8D%5C%22%2C%5C%22unit_weight%5C%22%3A0.003%2C%5C%22safe_num%5C%22%3A30%2C%5C%22stock_num%5C%22%3A150%7D%2C%5Cn%7D%5Cn%5Cn%23%20%E6%A8%A1%E6%8B%9F%E7%A7%B0%E9%87%8D%E4%BC%A0%E6%84%9F%E5%99%A8%E8%AF%BB%E5%8F%96%E5%87%BD%E6%95%B0%5Cndef%20read_weight(bin_no%3Aint)-%3Efloat%3A%5Cn%20%20%20%20%5C%22%5C%22%5C%22%E8%AF%BB%E5%8F%96%E6%8C%87%E5%AE%9A%E4%BB%93%E4%BD%8D%E5%BD%93%E5%89%8D%E9%87%8D%E9%87%8F%EF%BC%8C%E7%A1%AC%E4%BB%B6%E5%AF%B9%E6%8E%A5%E6%97%B6%E6%9B%BF%E6%8D%A2%E6%88%90%E4%B8%B2%E5%8F%A3%E8%AF%BB%E5%8F%96%E4%BC%A0%E6%84%9F%E5%99%A8%E4%BB%A3%E7%A0%81%5C%22%5C%22%5C%22%5Cn%20%20%20%20import%20random%5Cn%20%20%20%20noise%20%3D%20random.uniform(-0.0005%2C%200.0005)%5Cn%20%20%20%20return%20bin_config%5Bbin_no%5D%5B%5C%22stock_num%5C%22%5D%20*%20bin_config%5Bbin_no%5D%5B%5C%22unit_weight%5C%22%5D%20%2B%20noise%5Cn%5Cn%23%20%E7%AE%80%E5%8D%95%E6%BB%91%E5%8A%A8%E5%B9%B3%E5%9D%87%E6%BB%A4%E6%B3%A2%E7%AE%97%E6%B3%95%EF%BC%88%E6%B6%88%E9%99%A4%E8%BD%A6%E9%97%B4%E9%9C%87%E5%8A%A8%E5%B9%B2%E6%89%B0%EF%BC%89%5Cndef%20weight_filter(bin_no%2C%20sample_count%3D5)%3A%5Cn%20%20%20%20weights%20%3D%20%5B%5D%5Cn%20%20%20%20for%20_%20in%20range(sample_count)%3A%5Cn%20%20%20%20%20%20%20%20w%20%3D%20read_weight(bin_no)%5Cn%20%20%20%20%20%20%20%20weights.append(w)%5Cn%20%20%20%20%20%20%20%20time.sleep(0.02)%5Cn%20%20%20%20return%20sum(weights)%2Flen(weights)%5Cn%5Cn%23%20%E5%BC%80%E9%97%A8%E9%A2%86%E6%96%99%E6%B5%81%E7%A8%8B%5Cndef%20open_bin(bin_no%3Aint%2C%20user_id%3Astr%2C%20user_name%3Astr)%3A%5Cn%20%20%20%20%5C%22%5C%22%5C%22%E6%89%93%E5%BC%80%E4%BB%93%E4%BD%8D%EF%BC%8C%E8%AE%B0%E5%BD%95%E9%A2%86%E6%96%99%E5%89%8D%E9%87%8D%E9%87%8F%5C%22%5C%22%5C%22%5Cn%20%20%20%20print(f%5C%22%E3%80%90%E6%9D%83%E9%99%90%E6%A0%A1%E9%AA%8C%E9%80%9A%E8%BF%87%E3%80%91%E7%94%A8%E6%88%B7%3A%7Buser_name%7D%20%E6%89%93%E5%BC%80%E4%BB%93%E4%BD%8D%7Bbin_no%7D%5C%22)%5Cn%20%20%20%20weight_before%20%3D%20weight_filter(bin_no)%5Cn%20%20%20%20%23%20%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%E6%AD%A4%E5%A4%84%E5%8F%91%E9%80%81%E6%8C%87%E4%BB%A4%E6%89%93%E5%BC%80%E7%94%B5%E7%A3%81%E9%94%81%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%5Cn%20%20%20%20print(f%5C%22%E4%BB%93%E4%BD%8D%7Bbin_no%7D%E7%94%B5%E7%A3%81%E9%94%81%E5%BC%80%E5%90%AF%EF%BC%8C%E8%AF%B7%E5%8F%96%E6%96%99%EF%BC%8C%E5%85%B3%E9%97%A8%E5%90%8E%E8%87%AA%E5%8A%A8%E7%9B%98%E7%82%B9%5C%22)%5Cn%20%20%20%20%23%20%E7%AD%89%E5%BE%85%E5%85%B3%E9%97%A8%E4%BF%A1%E5%8F%B7(%E5%AE%9E%E9%99%85%E5%AF%B9%E6%8E%A5%E5%85%B3%E9%97%A8%E4%BC%A0%E6%84%9F%E5%99%A8)%5Cn%20%20%20%20input(%5C%22%E6%8C%89%E4%B8%8B%E5%9B%9E%E8%BD%A6%E6%A8%A1%E6%8B%9F%E5%85%B3%E9%97%A8%5C%22)%5Cn%20%20%20%20weight_after%20%3D%20weight_filter(bin_no)%5Cn%5Cn%20%20%20%20%23%20%E8%AE%A1%E7%AE%97%E9%87%8D%E9%87%8F%E5%8F%98%E5%8C%96%5Cn%20%20%20%20delta_weight%20%3D%20weight_before%20-%20weight_after%5Cn%5Cn%20%20%20%20if%20delta_weight%20%3C%20SAFE_WEIGHT_THRESHOLD%3A%5Cn%20%20%20%20%20%20%20%20print(%5C%22%E9%87%8D%E9%87%8F%E5%8F%98%E5%8C%96%E8%BF%87%E5%B0%8F%EF%BC%8C%E5%88%A4%E5%AE%9A%E6%9C%AA%E5%8F%96%E6%96%99%5C%22)%5Cn%20%20%20%20%20%20%20%20return%5Cn%5Cn%20%20%20%20%23%20%E9%87%8D%E9%87%8F%E6%8D%A2%E7%AE%97%E7%89%A9%E6%96%99%E9%A2%86%E7%94%A8%E6%95%B0%E9%87%8F%5Cn%20%20%20%20unit_w%20%3D%20bin_config%5Bbin_no%5D%5B%5C%22unit_weight%5C%22%5D%5Cn%20%20%20%20take_num%20%3D%20round(delta_weight%20%2F%20unit_w)%5Cn%5Cn%20%20%20%20%23%20%E6%9B%B4%E6%96%B0%E6%9C%AC%E5%9C%B0%E5%BA%93%E5%AD%98%5Cn%20%20%20%20bin_config%5Bbin_no%5D%5B%5C%22stock_num%5C%22%5D%20-%3D%20take_num%5Cn%20%20%20%20new_stock%20%3D%20bin_config%5Bbin_no%5D%5B%5C%22stock_num%5C%22%5D%5Cn%5Cn%20%20%20%20%23%20%E7%94%9F%E6%88%90%E9%A2%86%E7%94%A8%E6%97%A5%E5%BF%97%5Cn%20%20%20%20record%20%3D%20%7B%5Cn%20%20%20%20%20%20%20%20%5C%22cabinet_id%5C%22%3AWAREHOUSE_ID%2C%5Cn%20%20%20%20%20%20%20%20%5C%22bin_no%5C%22%3Abin_no%2C%5Cn%20%20%20%20%20%20%20%20%5C%22user_id%5C%22%3Auser_id%2C%5Cn%20%20%20%20%20%20%20%20%5C%22user_name%5C%22%3Auser_name%2C%5Cn%20%20%20%20%20%20%20%20%5C%22material_name%5C%22%3Abin_config%5Bbin_no%5D%5B%5C%22name%5C%22%5D%2C%5Cn%20%20%20%20%20%20%20%20%5C%22take_num%5C%22%3Atake_num%2C%5Cn%20%20%20%20%20%20%20%20%5C%22remain_stock%5C%22%3Anew_stock%2C%5Cn%20%20%20%20%20%20%20%20%5C%22timestamp%5C%22%3Atime.strftime(%5C%22%25Y%E2%80%91%25m%E2%80%91%25d%20%25H%3A%25M%3A%25S%5C%22)%5Cn%20%20%20%20%7D%5Cn%20%20%20%20print(%5C%22%3D%3D%3D%3D%3D%E9%A2%86%E7%94%A8%E8%AE%B0%E5%BD%95%E7%94%9F%E6%88%90%3D%3D%3D%3D%3D%5C%22)%5Cn%20%20%20%20print(json.dumps(record%2Censure_ascii%3DFalse%2Cindent%3D2))%5Cn%5Cn%20%20%20%20%23%20%E5%BA%93%E5%AD%98%E9%A2%84%E8%AD%A6%E5%88%A4%E6%96%AD%5Cn%20%20%20%20if%20new_stock%20%3C%3D%20bin_config%5Bbin_no%5D%5B%5C%22safe_num%5C%22%5D%3A%5Cn%20%20%20%20%20%20%20%20print(f%5C%22%E2%9A%A0%EF%B8%8F%E9%A2%84%E8%AD%A6%EF%BC%9A%E4%BB%93%E4%BD%8D%7Bbin_no%7D%E7%89%A9%E6%96%99%E4%BD%8E%E4%BA%8E%E5%AE%89%E5%85%A8%E5%BA%93%E5%AD%98%EF%BC%8C%E8%AF%B7%E5%8F%8A%E6%97%B6%E8%A1%A5%E8%B4%A7%EF%BC%81%5C%22)%5Cn%5Cn%20%20%20%20%23%20%E4%B8%8A%E6%8A%A5%E4%BA%91%E7%AB%AF%E6%8E%A5%E5%8F%A3%E5%87%BD%E6%95%B0(%E6%AD%A4%E5%A4%84%E6%A8%A1%E6%8B%9F)%5Cn%20%20%20%20upload_to_cloud(record)%5Cn%5Cndef%20upload_to_cloud(record%3Adict)%3A%5Cn%20%20%20%20%5C%22%5C%22%5C%22%E4%B8%8A%E4%BC%A0%E9%A2%86%E7%94%A8%E6%95%B0%E6%8D%AE%E8%87%B3%E5%90%8E%E5%8F%B0%EF%BC%8C%E6%96%AD%E7%BD%91%E6%97%B6%E5%AD%98%E5%85%A5%E6%9C%AC%E5%9C%B0%E7%BC%93%E5%AD%98%E6%96%87%E4%BB%B6%5C%22%5C%22%5C%22%5Cn%20%20%20%20try%3A%5Cn%20%20%20%20%20%20%20%20%23%20requests.post(%5C%22https%3A%2F%2Fxxx%2Fapi%2Freceive_record%5C%22%2Cjson%3Drecord)%5Cn%20%20%20%20%20%20%20%20print(%5C%22%E9%A2%86%E7%94%A8%E6%95%B0%E6%8D%AE%E6%88%90%E5%8A%9F%E4%B8%8A%E4%BC%A0%E7%AE%A1%E7%90%86%E5%90%8E%E5%8F%B0%5C%22)%5Cn%20%20%20%20except%20Exception%20as%20e%3A%5Cn%20%20%20%20%20%20%20%20%23%20%E6%96%AD%E7%BD%91%E7%BC%93%E5%AD%98%E9%80%BB%E8%BE%91%EF%BC%9A%E5%86%99%E5%85%A5%E6%9C%AC%E5%9C%B0%E6%96%87%E4%BB%B6%EF%BC%8C%E7%BD%91%E7%BB%9C%E6%81%A2%E5%A4%8D%E5%90%8E%E9%87%8D%E4%BC%A0%5Cn%20%20%20%20%20%20%20%20with%20open(%5C%22offline_cache.json%5C%22%2C%5C%22a%5C%22%2Cencoding%3D%5C%22utf%E2%80%918%5C%22)as%20f%3A%5Cn%20%20%20%20%20%20%20%20%20%20%20%20f.write(json.dumps(record%2Censure_ascii%3DFalse)%2B%5C%22%5C%5Cn%5C%22)%5Cn%20%20%20%20%20%20%20%20print(%5C%22%E7%BD%91%E7%BB%9C%E5%BC%82%E5%B8%B8%EF%BC%8C%E6%95%B0%E6%8D%AE%E5%AD%98%E5%85%A5%E6%9C%AC%E5%9C%B0%E7%BC%93%E5%AD%98%EF%BC%8C%E7%AD%89%E5%BE%85%E9%87%8D%E4%BC%A0%5C%22)%5Cn%5Cn%5Cn%23%20%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%20%E7%A8%8B%E5%BA%8F%E5%85%A5%E5%8F%A3%E6%BC%94%E7%A4%BA%20%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%5Cnif%20__name__%20%3D%3D%20%5C%22__main__%5C%22%3A%5Cn%20%20%20%20print(%5C%22%3D%3D%3D%3D%3D%E8%81%9A%E6%BE%9C%E6%99%BA%E8%83%BD%E2%80%91%E6%A0%87%E5%87%86%E4%BB%B6%E6%99%BA%E8%83%BD%E6%96%99%E6%9F%9C%E4%B8%BB%E6%8E%A7%E7%A8%8B%E5%BA%8F%E5%90%AF%E5%8A%A8%3D%3D%3D%3D%3D%5C%22)%5Cn%20%20%20%20%23%20%E6%A8%A1%E6%8B%9F%E4%BA%BA%E5%91%98%E7%99%BB%E5%BD%95%E6%88%90%E5%8A%9F%EF%BC%8C%E5%BC%80%E5%A7%8B%E9%A2%86%E6%96%99%5Cn%20%20%20%20open_bin(bin_no%3D1%2Cuser_id%3D%5C%22U0012%5C%22%2Cuser_name%3D%5C%22%E5%BC%A0%E4%B8%89%5C%22)%5Cn%22%2C%22classes%22%3Anull%7D" data-cke-widget-keep-attr="0" data-cke-widget-upcasted="1" data-widget="codeSnippet">import&nbsp;time import&nbsp;json #&nbsp;======================&nbsp;配置参数&nbsp;====================== SAFE_WEIGHT_THRESHOLD&nbsp;=&nbsp;0.01&nbsp;&nbsp;#&nbsp;重量变化阈值(Kg) WAREHOUSE_ID&nbsp;=&nbsp;&quot;ZL‑ST‑001&quot;&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;料柜编号聚澜智能 #&nbsp;仓位物料配置:仓位号、物料名称、单颗重量(kg)、安全库存数量 bin_config&nbsp;=&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;1:{&quot;name&quot;:&quot;M6螺丝&quot;,&quot;unit_weight&quot;:0.002,&quot;safe_num&quot;:50,&quot;stock_num&quot;:200}, &nbsp;&nbsp;&nbsp;&nbsp;2:{&quot;name&quot;:&quot;M8螺母&quot;,&quot;unit_weight&quot;:0.003,&quot;safe_num&quot;:30,&quot;stock_num&quot;:150}, } #&nbsp;模拟称重传感器读取函数 def&nbsp;read_weight(bin_no:int)-&gt;float: &nbsp;&nbsp;&nbsp;&nbsp;&quot;&quot;&quot;读取指定仓位当前重量,硬件对接时替换成串口读取传感器代码&quot;&quot;&quot; &nbsp;&nbsp;&nbsp;&nbsp;import&nbsp;random &nbsp;&nbsp;&nbsp;&nbsp;noise&nbsp;=&nbsp;random.uniform(-0.0005,&nbsp;0.0005) &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;bin_config[bin_no][&quot;stock_num&quot;]&nbsp;*&nbsp;bin_config[bin_no][&quot;unit_weight&quot;]&nbsp;+&nbsp;noise #&nbsp;简单滑动平均滤波算法(消除车间震动干扰) def&nbsp;weight_filter(bin_no,&nbsp;sample_count=5): &nbsp;&nbsp;&nbsp;&nbsp;weights&nbsp;=&nbsp;[] &nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;_&nbsp;in&nbsp;range(sample_count): &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;w&nbsp;=&nbsp;read_weight(bin_no) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;weights.append(w) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;time.sleep(0.02) &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;sum(weights)/len(weights) #&nbsp;开门领料流程 def&nbsp;open_bin(bin_no:int,&nbsp;user_id:str,&nbsp;user_name:str): &nbsp;&nbsp;&nbsp;&nbsp;&quot;&quot;&quot;打开仓位,记录领料前重量&quot;&quot;&quot; &nbsp;&nbsp;&nbsp;&nbsp;print(f&quot;【权限校验通过】用户:{user_name}&nbsp;打开仓位{bin_no}&quot;) &nbsp;&nbsp;&nbsp;&nbsp;weight_before&nbsp;=&nbsp;weight_filter(bin_no) &nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;==========此处发送指令打开电磁锁========== &nbsp;&nbsp;&nbsp;&nbsp;print(f&quot;仓位{bin_no}电磁锁开启,请取料,关门后自动盘点&quot;) &nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;等待关门信号(实际对接关门传感器) &nbsp;&nbsp;&nbsp;&nbsp;input(&quot;按下回车模拟关门&quot;) &nbsp;&nbsp;&nbsp;&nbsp;weight_after&nbsp;=&nbsp;weight_filter(bin_no) &nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;计算重量变化 &nbsp;&nbsp;&nbsp;&nbsp;delta_weight&nbsp;=&nbsp;weight_before&nbsp;-&nbsp;weight_after &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;delta_weight&nbsp;&lt;&nbsp;SAFE_WEIGHT_THRESHOLD: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print(&quot;重量变化过小,判定未取料&quot;) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return &nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;重量换算物料领用数量 &nbsp;&nbsp;&nbsp;&nbsp;unit_w&nbsp;=&nbsp;bin_config[bin_no][&quot;unit_weight&quot;] &nbsp;&nbsp;&nbsp;&nbsp;take_num&nbsp;=&nbsp;round(delta_weight&nbsp;/&nbsp;unit_w) &nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;更新本地库存 &nbsp;&nbsp;&nbsp;&nbsp;bin_config[bin_no][&quot;stock_num&quot;]&nbsp;-=&nbsp;take_num &nbsp;&nbsp;&nbsp;&nbsp;new_stock&nbsp;=&nbsp;bin_config[bin_no][&quot;stock_num&quot;] &nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;生成领用日志 &nbsp;&nbsp;&nbsp;&nbsp;record&nbsp;=&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;cabinet_id&quot;:WAREHOUSE_ID, &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;bin_no&quot;:bin_no, &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;user_id&quot;:user_id, &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;user_name&quot;:user_name, &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;material_name&quot;:bin_config[bin_no][&quot;name&quot;], &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;take_num&quot;:take_num, &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;remain_stock&quot;:new_stock, &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;timestamp&quot;:time.strftime(&quot;%Y‑%m‑%d&nbsp;%H:%M:%S&quot;) &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;print(&quot;=====领用记录生成=====&quot;) &nbsp;&nbsp;&nbsp;&nbsp;print(json.dumps(record,ensure_ascii=False,indent=2)) &nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;库存预警判断 &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;new_stock&nbsp;&lt;=&nbsp;bin_config[bin_no][&quot;safe_num&quot;]: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print(f&quot;⚠️预警:仓位{bin_no}物料低于安全库存,请及时补货!&quot;) &nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;上报云端接口函数(此处模拟) &nbsp;&nbsp;&nbsp;&nbsp;upload_to_cloud(record) def&nbsp;upload_to_cloud(record:dict): &nbsp;&nbsp;&nbsp;&nbsp;&quot;&quot;&quot;上传领用数据至后台,断网时存入本地缓存文件&quot;&quot;&quot; &nbsp;&nbsp;&nbsp;&nbsp;try: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;requests.post(&quot;https://xxx/api/receive_record&quot;,json=record) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print(&quot;领用数据成功上传管理后台&quot;) &nbsp;&nbsp;&nbsp;&nbsp;except&nbsp;Exception&nbsp;as&nbsp;e: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;断网缓存逻辑:写入本地文件,网络恢复后重传 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;with&nbsp;open(&quot;offline_cache.json&quot;,&quot;a&quot;,encoding=&quot;utf‑8&quot;)as&nbsp;f: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;f.write(json.dumps(record,ensure_ascii=False)+&quot;\n&quot;) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print(&quot;网络异常,数据存入本地缓存,等待重传&quot;) #&nbsp;======================&nbsp;程序入口演示&nbsp;====================== if&nbsp;__name__&nbsp;==&nbsp;&quot;__main__&quot;: &nbsp;&nbsp;&nbsp;&nbsp;print(&quot;=====聚澜智能‑标准件智能料柜主控程序启动=====&quot;) &nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;模拟人员登录成功,开始领料 &nbsp;&nbsp;&nbsp;&nbsp;open_bin(bin_no=1,user_id=&quot;U0012&quot;,user_name=&quot;张三&quot;)</pre><p><span class="cke_reset cke_widget_drag_handler_container" style="background:rgba(220,220,220,0.5);background-image:url(https://csdnimg.cn/release/blog_editor_html/release2.4.6/ckeditor/plugins/widget/images/handle.png);display:none;"></span></p><p>三、后端 API 接口示例(领用记录上报,伪代码)</p><pre class="cke_widget_element" data-cke-widget-data="%7B%22code%22%3A%22POST%20%2Fapi%2Fv1%2Fmaterial%2Ftake_record%5CnContent%E2%80%91Type%3Aapplication%2Fjson%5Cn%5Cn%E8%AF%B7%E6%B1%82%E4%BD%93%EF%BC%9A%5Cn%7B%5Cn%20%20%5C%22cabinet_id%5C%22%3A%5C%22ZL%E2%80%91ST%E2%80%91001%5C%22%2C%5Cn%20%20%5C%22bin_no%5C%22%3A1%2C%5Cn%20%20%5C%22user_id%5C%22%3A%5C%22U0012%5C%22%2C%5Cn%20%20%5C%22user_name%5C%22%3A%5C%22%E5%BC%A0%E4%B8%89%5C%22%2C%5Cn%20%20%5C%22material_name%5C%22%3A%5C%22M6%E8%9E%BA%E4%B8%9D%5C%22%2C%5Cn%20%20%5C%22take_num%5C%22%3A5%2C%5Cn%20%20%5C%22remain_stock%5C%22%3A195%2C%5Cn%20%20%5C%22timestamp%5C%22%3A%5C%222026%E2%80%9108%E2%80%9125%2014%3A30%3A22%5C%22%5Cn%7D%5Cn%22%2C%22classes%22%3Anull%7D" data-cke-widget-keep-attr="0" data-cke-widget-upcasted="1" data-widget="codeSnippet">POST&nbsp;/api/v1/material/take_record Content‑Type:application/json 请求体: { &nbsp;&nbsp;&quot;cabinet_id&quot;:&quot;ZL‑ST‑001&quot;, &nbsp;&nbsp;&quot;bin_no&quot;:1, &nbsp;&nbsp;&quot;user_id&quot;:&quot;U0012&quot;, &nbsp;&nbsp;&quot;user_name&quot;:&quot;张三&quot;, &nbsp;&nbsp;&quot;material_name&quot;:&quot;M6螺丝&quot;, &nbsp;&nbsp;&quot;take_num&quot;:5, &nbsp;&nbsp;&quot;remain_stock&quot;:195, &nbsp;&nbsp;&quot;timestamp&quot;:&quot;2026‑08‑25&nbsp;14:30:22&quot; }</pre><p><span class="cke_reset cke_widget_drag_handler_container" style="background:rgba(220,220,220,0.5);background-image:url(https://csdnimg.cn/release/blog_editor_html/release2.4.6/ckeditor/plugins/widget/images/handle.png);display:none;"></span></p><p><br/></p><p><br/></p><p><span data-cke-copybin-end="1"></span></p><p><br/></p>
请留下您的联系方式,我们免费为您提供最新方案和报价
提 交
15137460293 发送短信
报名免费获取设计方案及报价