InvenTree 库存调整完全指南移动、增减、盘点与合并操作详解【免费下载链接】InvenTreeOpen Source Inventory Management System项目地址: https://gitcode.com/GitHub_Trending/in/InvenTree本文围绕 InvenTree 开源库存管理系统的库存调整Stock Adjustments功能展开系统讲解通过库存表格的「Stock Options」菜单完成的移动、入库、出库、盘点Stocktake与合并五大操作。读完本文你将掌握每类调整的适用场景、表单字段含义、合并约束条件并理解其背后由 stock/api.py、stock/serializers.py 与 stock/models.py 构成的完整调用链。库存调整功能总览InvenTree 为库存水平的管理提供了「简单却强大」的支持所有库存调整类型均可从任意库存条目表格stock items table顶部的Stock Options下拉菜单进入包括移动Move、添加Add、移除Remove、盘点Count与合并Merge五种操作。每一种调整操作都会由系统自动记录到对应库存条目的历史中从而始终维护一条完整、可追溯的库存变更轨迹。这一点在源码中有明确体现所有批量调整接口都共享StockAdjustView基类并在执行时开启事务transaction.atomic()、批量事件batch_events()与批量跟踪记录batch_tracking_entries()确保「改数量 记历史」作为一个原子操作完成见 stock/serializers.py 中的StockTransferSerializer.save实现。从 API 路由可以看到全部批量调整端点均位于/api/stock/之下见 stock/api.pyURL 路径端点名称功能/api/stock/count/api-stock-count盘点库存/api/stock/add/api-stock-add添加库存/api/stock/remove/api-stock-remove移除库存/api/stock/transfer/api-stock-transfer移动库存/api/stock/merge/api-stock-merge合并库存/api/stock/change_status/api-stock-change-status批量修改状态/api/stock/assign/api-stock-assign分配库存给客户/api/stock/return/api-stock-return客户退货入库其中count、add、remove、transfer四个端点的视图类StockCount、StockAdd、StockRemove、StockTransfer均继承自通用基类StockAdjustView见 stock/api.py共享同一套批量处理逻辑。移动库存Move Stock移动操作允许在单次操作中将多个库存条目移动到新的库位Location。每个条目都会被移动到所选目标库位同时向库存条目的历史中添加一条库存跟踪记录。从源码看移动动作最终落到模型层的move(location, notes, user, **kwargs)方法见 stock/models.py。有几个值得注意的细节部分移动支持如果通过quantity参数指定少于当前总量的数量系统会新建一个含指定数量的库存条目并移动之同时从原条目中减去对应数量实现「拆单移动」并发安全方法首先调用lock_quantity()锁定数据库行使并发调整被串行化处理出库状态校验若全局设置STOCK_ALLOW_OUT_OF_STOCK_TRANSFER为 False默认则不在库out of stock的条目无法被移动移动时会记录location与old_location的变更 delta用于生成跟踪历史。添加库存Add Stock添加操作用于向库存条目记录中增加零件数量——典型场景是将零件退回库存。每个被选中条目的在库数量in-stock quantity会按给定的数量增加。模型层对应的实现是add_stock(quantity, user, **kwargs)见 stock/models.py其核心规则序列化零件serialized无法添加每个序列号对应唯一实物serialized为真时方法直接返回False数量必须为正quantity 0的请求会被忽略StockAddSerializer.save中同样有quantity 0时continue的保护逻辑见 stock/serializers.py可选字段batch、status、packaging等可选传递字段可随添加操作一并更新由StockItem.optional_transfer_fields()定义返回[batch, status, packaging]见 stock/models.py。移除库存Remove Stock移除操作与添加相对用于从库存条目记录中减去零件——典型场景是从库存取件用于生产或发运。每个被选中条目的在库数量会按给定数量减少。模型层实现为take_stock(quantity, user, codeStockHistoryCode.STOCK_REMOVE, **kwargs)见 stock/models.py约束与添加操作类似序列化零件不可移除数量必须为正且实际移除量不会超过当前可用量quantity min(quantity, self.quantity)该检查在行锁之后执行针对的是数据库中的最新值而非可能过期的内存副本通过code参数可指定不同的历史记录代码默认为STOCK_REMOVE移除后的数量被记录到deltasremoved与quantity字段中供跟踪历史展示。add_stock与take_stock都默认以transaction.atomic装饰并先锁定行避免并发条件下出现库存数量竞争问题。盘点库存Count Stock / Stocktake盘点操作用于在某一时间点记录库存条目的实际数量。表单中每个零件的数量会根据库存历史预填当前数量便于快速核对。盘点表单还提供一个可选的Location字段填写后所有被盘点的条目会在同一次操作中一并移动到新库位留空则各条目保留当前位置。模型层的stocktake(count, user, **kwargs)见 stock/models.py是整个盘点的核心几个关键行为可直接修正任意数量盘点直接设定新数量调用updateQuantity不关心差异方向因此盘点既可能增加也可能减少库存附带字段更新除数量外location、status以及batch等可选字段可以随盘点一并调整且都会写入跟踪 delta彻底记录无论盘点后条目是否因数量归零而被删除delete_on_deplete场景都会生成一条STOCK_COUNT类型的跟踪记录——因为StockItemTracking.item使用SET_NULL历史记录不会随条目删除而丢失事件通知盘点成功后触发StockEvents.ITEM_COUNTED事件供插件与通知系统订阅见 stock/events.py。值得一提的校验在 StockCountSerializer.validate_location 中结构性库位structural location不能作为盘点的目标库位这一限制同样适用于移动Transfer操作见 StockTransferSerializer。合并库存Merge Stock合并操作允许用户将两个或更多库存条目合并为一个。系统会累加所有参与合并条目的库存数量并创建一个数量为最终合计的新库存条目在实现中以第一个条目为「基准条目」其余条目的数量被并入其中见 StockMergeSerializer.save。合并的前置条件文档中明确列出了合并必须满足的条件这些条件在can_merge方法中逐条强制校验见 stock/models.py通用约束针对每个待合并条目库存条目不能与自身合并Duplicate stock items校验序列化器层也会拦截重复条目见 stock/serializers.py只有指向同一零件Part的库存条目才能合并条目之间的供应商零件supplier part必须一致除非用户显式允许供应商零件不同条目之间的库存状态status必须一致除非用户显式允许状态不同至少提供两个库存条目At least two stock items must be provided。状态类约束满足任一即不可合并条目已被分配到销售订单sales_order非空条目被安装在其他条目中belongs_to非空条目包含其他条目installed_item_count() 0条目已被分配给客户customer非空条目当前处于生产中is_building为真条目是序列化的serialized为真序列化库存不可合并。若条件满足合并过程将累加所有条目的数量合并后的条目继承基准条目的批次、库位等信息其余条目的数量被并入。特别值得注意的是can_merge会在两个方向都做校验self.can_merge(other)且other.can_merge(self)确保通用状态约束同样应用于被并入的条目见 stock/models.py。操作步骤在库存表格中勾选两个或更多条目点击表格上方的Stock Actions包裹图标按钮在菜单中点击Merge合并图标选项在弹出的Merge Stock Items表单中可按需勾选允许合并不同供应商allow_mismatched_suppliers或允许合并不同状态allow_mismatched_status——两者默认均为关闭disabled by default为新合并的库存条目选择目标库位必填见 stock/serializers.py可选填写 Notes 备注点击Submit确认合并。合并的底层实现细节merge_stock_items方法见 stock/models.py的实现在工程上相当严谨行锁与并发防护按主键升序对所有参与条目执行select_for_update()既锁定行、刷新各自数量又避免并发合并时的死锁若某条目在锁定时已不存在则整个合并被取消分配迁移被并入条目的生产订单分配allocations与销售订单分配sales_order_allocations会自动转挂到合并后的基准条目上定价数据保留各条目的采购价格与数量会被收集进pricing_data用于合并后的加权价格计算跟踪记录合并完成后被并入条目的跟踪历史会被处理合并动作本身会生成跟踪记录说明数量变更。在 StockMergeSerializer.validate 中所有条目会在提交阶段先逐一执行can_merge(raise_errorTrue)预校验再以第一个条目为基准对后续条目做两两比对保证进入save()阶段时合并一定可行。结合测试验证行为stock/test_api.py 中提供了大量覆盖上述功能的测试用例可作为理解行为的补充材料test_count_serialized约 L2976、test_count_with_location约 L3042、test_count_unchanged_quantity_saves_field_changes约 L3127验证序列化条目、带库位盘点和「数量未变但字段变更也需落库」等盘点边界test_bulk_count_query_benchmark、test_bulk_add_query_benchmark、test_bulk_remove_query_benchmark约 L3177-L3241验证批量调整接口的查询性能test_transfer_without_merge_creates_separate_lot约 L3323、test_transfer_with_merge_combines_lots约 L3348、test_transfer_merge_does_not_copy_source_tracking约 L3407验证移动transfer操作中「是否并入现有库存merge字段」的差异行为test_valid_merge约 L4205验证合法合并的完整流程。小结InvenTree 的库存调整体系以「批量操作 自动跟踪」为设计核心移动、添加、移除、盘点覆盖了日常库存变动的全部场景而合并操作则在严格的业务约束同零件、供应商/状态一致、无订单/生产/序列化占用下通过事务、行锁与分配迁移保证了数据一致性。无论是通过界面操作还是直接调用/api/stock/系列 REST 端点每一次调整都会被完整记录为库存审计与追溯提供可靠依据。如需进一步了解库存管理的其他方面可参考 库存总览文档、库位所有者配置 与 库存追溯。【免费下载链接】InvenTreeOpen Source Inventory Management System项目地址: https://gitcode.com/GitHub_Trending/in/InvenTree创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考