<p><span data-cke-copybin-start="1"></span></p><h2><span id="cke_bm_184S" style="display:none"> </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 time
import json
# ====================== 配置参数 ======================
SAFE_WEIGHT_THRESHOLD = 0.01 # 重量变化阈值(Kg)
WAREHOUSE_ID = "ZL‑ST‑001" # 料柜编号聚澜智能
# 仓位物料配置:仓位号、物料名称、单颗重量(kg)、安全库存数量
bin_config = {
1:{"name":"M6螺丝","unit_weight":0.002,"safe_num":50,"stock_num":200},
2:{"name":"M8螺母","unit_weight":0.003,"safe_num":30,"stock_num":150},
}
# 模拟称重传感器读取函数
def read_weight(bin_no:int)->float:
"""读取指定仓位当前重量,硬件对接时替换成串口读取传感器代码"""
import random
noise = random.uniform(-0.0005, 0.0005)
return bin_config[bin_no]["stock_num"] * bin_config[bin_no]["unit_weight"] + noise
# 简单滑动平均滤波算法(消除车间震动干扰)
def weight_filter(bin_no, sample_count=5):
weights = []
for _ in range(sample_count):
w = read_weight(bin_no)
weights.append(w)
time.sleep(0.02)
return sum(weights)/len(weights)
# 开门领料流程
def open_bin(bin_no:int, user_id:str, user_name:str):
"""打开仓位,记录领料前重量"""
print(f"【权限校验通过】用户:{user_name} 打开仓位{bin_no}")
weight_before = weight_filter(bin_no)
# ==========此处发送指令打开电磁锁==========
print(f"仓位{bin_no}电磁锁开启,请取料,关门后自动盘点")
# 等待关门信号(实际对接关门传感器)
input("按下回车模拟关门")
weight_after = weight_filter(bin_no)
# 计算重量变化
delta_weight = weight_before - weight_after
if delta_weight < SAFE_WEIGHT_THRESHOLD:
print("重量变化过小,判定未取料")
return
# 重量换算物料领用数量
unit_w = bin_config[bin_no]["unit_weight"]
take_num = round(delta_weight / unit_w)
# 更新本地库存
bin_config[bin_no]["stock_num"] -= take_num
new_stock = bin_config[bin_no]["stock_num"]
# 生成领用日志
record = {
"cabinet_id":WAREHOUSE_ID,
"bin_no":bin_no,
"user_id":user_id,
"user_name":user_name,
"material_name":bin_config[bin_no]["name"],
"take_num":take_num,
"remain_stock":new_stock,
"timestamp":time.strftime("%Y‑%m‑%d %H:%M:%S")
}
print("=====领用记录生成=====")
print(json.dumps(record,ensure_ascii=False,indent=2))
# 库存预警判断
if new_stock <= bin_config[bin_no]["safe_num"]:
print(f"⚠️预警:仓位{bin_no}物料低于安全库存,请及时补货!")
# 上报云端接口函数(此处模拟)
upload_to_cloud(record)
def upload_to_cloud(record:dict):
"""上传领用数据至后台,断网时存入本地缓存文件"""
try:
# requests.post("https://xxx/api/receive_record",json=record)
print("领用数据成功上传管理后台")
except Exception as e:
# 断网缓存逻辑:写入本地文件,网络恢复后重传
with open("offline_cache.json","a",encoding="utf‑8")as f:
f.write(json.dumps(record,ensure_ascii=False)+"\n")
print("网络异常,数据存入本地缓存,等待重传")
# ====================== 程序入口演示 ======================
if __name__ == "__main__":
print("=====聚澜智能‑标准件智能料柜主控程序启动=====")
# 模拟人员登录成功,开始领料
open_bin(bin_no=1,user_id="U0012",user_name="张三")</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 /api/v1/material/take_record
Content‑Type:application/json
请求体:
{
"cabinet_id":"ZL‑ST‑001",
"bin_no":1,
"user_id":"U0012",
"user_name":"张三",
"material_name":"M6螺丝",
"take_num":5,
"remain_stock":195,
"timestamp":"2026‑08‑25 14:30:22"
}</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>