Odoo 的库存管理与OpenERP之前的版本有了很大的不同,解读Odoo新的WMS模块中的新特性
原文来自:http://shine-it.net/index.php/topic,16409.0.html
库存移动(Stock Move)新玩法
Odoo的库存移动不仅仅是存货在两个“存货地点”之间的移动的基本概念了,他们可以被“串联”在一起,可以用来生成或改变其对应的拣货单(Picking)。链式库存移动被广泛应用在各类库存操作中比如:多步收货或多步发货操作,多仓库间的配、补货操作等;而不仅限于之前OpenERP中MTO供货类型产品的发货等待对应供应商收货这样的链式库存移动的应用场景了。我们会描述如何通过“推”,“拉”规则来创建这些链式库存移动。
库存移动与拣货单的关联
仓管人员手动进行的库存操作的一般顺序是:先创建拣货单然后在明细中选择不同的产品及数量从而创建相应的库存移动。但是在确认销售订单时,Odoo则是自动创建对应销售订单明细的库存移动在先,然后才会去将这些库存移动与一个现有的拣货单关联或创建一个新的拣货单。
库存移动与拣货单关联的前提条件是库存移动设置了拣货类型(比如:我的公司:发货单)。如果库存移动有设置拣货类型,Odoo则会尝试搜索拣货单并与之关联。搜索的条件是这个拣货单要与库存移动有一致的状态,拣货类型,需求组(Procurement group, 即一组相关需求,比如来自同一订单), 源货位和目的货位。如果没有找到相应的拣货单则会新建一个拣货单并与之关联。
这种机制大大增加了灵活性。比如某些货品需要进入包装车间再包装,有些货品不需要的情况,订单中需包装的产品会被组合到一个拣货单中而不需要包装的产品会被组合进另一个拣货单中,而在发货时所有的货品又被重新组合到一个新的拣货单中。
拣货单几乎完全由其所含的库存移动决定。其状态由库存移动的状态和拣货类型决定,源货位和目的货位与其所含的库存移动的一致。预期拣货时间由所有库存移动指定日期中的最小日期决定。
拣货单的状态主要尤其所包含的库存移动决定:
如果所有的移动都是草稿状态,则拣货单也为草稿状态
如果所有的移动都是完成或取消,则拣货单也为完成或取消。
其他状态则同时取决于移动类型。移动类型用于决定客户是希望一次性完成全部产品的发货(一次性发货all at once)还是希望尽快收货(分批发货partial)。这种移动类型可以手动选择,也可以来自销售订单通过需求组传入。
如果是分批发货,则有一个特殊的状态:部分可用。当一个库存移动处于“确认/等待”状态时,部分库存已预留,这样的情况在Odoo中是允许的。该库存会仍然处于“确认/等待”的状态,但是会有一个“部分可用”的标签。这种情况下,拣货单的状态不再是“确认/等待"状态而会变为“部分可用”状态,这使得分批发货成为可能。另外,当拣货单中的部分库存移动处于预留可用状态,而其他库存移动仍然不可用时,拣货单也会变为“部分可用”状态。
有时一个库存移动并不会指定拣货类型,这意味着没有关联的拣货单。比如盘点操作及生产操作中所对应的库存移动。
创建链式库存移动的拉式(需求)和推式规则
推式规则:
根据一个库存移动的目标库位激发创建另一个库存移动的规则。新创建的库存移动的源库位与原库存移动的目标库位相同。
例如:当货品到达“收货”库位时,设定的推式规则将它们移动到“库存”库位。
所以,当“供应商库位”->"收货“库位的库存移动确认时,该规则会创建另一个库存移动:“收货库位“->“库存库位”。规则允许3中模式:自动(第二个库存移动会被自动确认),手动(第二个库存移动必须手动确认),手动不添加步骤(不创建第二个库存移动而是将第一个库存移动的目标库位替换为指定库位)
推式规则一般用于当采购订单确认后的收货操作,货品需要移入库存库位。
需求 (=拉式)规则:
拉式规则并非推式规则的反向操作!他们的基本不同点在于推式规则影响的是库存移动,而拉式规则影响的是需求。实际上称他们为需求规则更准确。但是,我们也可以这么说:推式规则作用于目标库位,而拉式规则作用于源库位。
当库存移动确认后,如果其需求方式(procurement method)为‘高级:应用需求规则’,则会在其源库位创建一个跟库存移动数量一致的需求单。需求规则会作用于该需求单用以满足需求。不同类型的需求规则会导致需求单运行后产生不同的结果,比如:从其他库位移动产品到原库存移动对应的源库位以满足其对产品的需求,或者通过采购收货到源库位以满足其对产品的需求,也或者通过生产入库到源库位来满足其对产品的需求。参见下图及说明:
这是一个"库存移动“的表单视图,默认情况下其“供应方式”(Supply Method)是“取自库存”(Default:Take from Stock),表示当该库存移动确定时将检查“源库位”是否有足够库存,如果库存不足则进入“等待可用”状态。而当我们将“供应方式”设为:”高级:应用需求规则时“,Odoo就会去检查与该库存移动的”源库位“相关的”需求规则“, 见下图:
上图中可以看到“需求规则”中有定义“需求库位”(Procurement Location), 并且在“动作”(action)中可以选择“采购”,“生产”,和“从其他库位移动存货“(选择此项会显示更多选项),根据“动作”的选择不同会产生对应的需求单,在需求单运行后会产生对应的采购或生产,或其他库存移动来满足“需求库位”的存货需求。
但是需求单也不必一定由库存移动产生。用户可以手动创建需求单,或在确认销售订单时,Odoo为每一个销售订单明细在“客户”货位创建需求单。事实上这个由需求单,库存移动单和需求规则所构建的体系在Odoo系统里是贯彻始终的。比如在最简单的库存管理设置中,当我们运行这些由销售订单创建的需求单时,这些需求规则就会创建出发运单。
在正常情况下需求单会经历下列状态:
已确认:需求单创建之后的状态
运行中:成功应用了一个需求规则(导致创建一个库存移动或报价单或生产单)
完成: 需求规则已应用并且产品已经转运到或已经在需求单所对应的货位了。
当不能找到需求规则或无法应用需求规则(比如产品上没有定义供应商)时,需求单会进入“出错”(Exception)状态。如果对产品的需求不再需要,也可以取消需求单。
默认情况下,Odoo会安装JIT计划模块。Odoo会在需求单确认时自动运算该需求。如果这导致了系统性能问题,我们也可以卸载该模块。这样只有销售订单创建的需求单会被立刻自动运行从而创建出发运单,而由库存移动创建的需求单则不会立即自动运算,而会由计划运行(Scheduler)统一安排运算时间。
由拉式规则生成的规则不能再应用推式规则了,所以拉式规则优先于推式规则。
需求规则和库存移动的需求方式
库存移动确认后是否会在其源库位创建需求单并应用需求规则取决于其需求方式的设置。只有设置了需求方式为“高级:应用需求规则”的库存移动会生成需求单。
当用户创建一个在拣货单时,其中的库存移动将使用默认的需求方式:“默认:取自库存”。这表示该库存移动不会在其源库位创建一个需求单,而会在源库位查找是否有足够的可用库存。这也是诸如“移动呆滞库存产品到滞销库位“这样的内部移库的基本逻辑。
但是如果用户将库存移动的需求方式改变为”高级:应用需求规则“,Odoo就会在该库存移动的源库位创建需求单。(译者:写文档的人这一通反反复复,是怕自己忘了吗:-) 比如,创建发货单可以导致一个与该发货单对应的采购订单的生成。
当我们设置了“拣货->包装->发货“这样的需求规则时。应用该需求规则,Odoo会自动生成从仓库货位向包装货位的库存移动。这样即使你手动创建一个从仓库的发货单,Odoo也会自动创建拣货/包装流程。
需求方式只对内部调拨,和发货有意义。收货操作不需要预留库存,所以他们总是使用默认设置”默认:来自库存“。
你可能会想是否可以连续创建多个这样的链式库存移动呢。事实上,当一个需求规则创建一个新的库存移动时,新的库存移动的需求方式可以被事先定义好。也就是说,需求规则可以决定新创建的库存移动是寻找并应用与其匹配的需求规则还是使用默认“来自库存”的设置。
这样就可以创建出下例表述的库存移动的长链。假设我们有设置了拣货-包装-发货的需求规则的MTS需求类型的产品,当包含该产品的销售订单确认时,“链式反应“启动。首先销售订单会在客户库位创建需求单,该需求单的运行会创建从仓库出货库位到客户库位的库存移动,而该库存移动的”需求方式“为”高级:应用需求规则“,这样就会在在”出货库位“创建一个需求单,如此循环直到在”包装货位“的需求单创建库存移动单,并且该库存移动单的需求方式为”默认:来自库存“。
Odoo 的库存管理与OpenERP之前的版本有了很大的不同,解读Odoo新的WMS模块中的新特性,布布扣,bubuko.com