MTO与MTS

1首先来说mto/mts最终是针对具体的每一个物料来的,something is made for order,something is  made for stock。这一点必须先明确。
2对每个物料而言sap都能够提供相应的计划策略,这个计划策略包括单纯的mto/mts,也包括复合的策略,即mto&mts.当然单纯的mto是不会考虑你的预测的,如果你需要就一个物料同时考虑两个策略,系统毫无疑问可以通过策略的变化实现,但是会引起一些计划冲销的变化,这种变化主要是针对下层物料出现的,比如说:有个客户订单很急很急,这个订单需要一种原材料a,这个订单准备3天后完成,mrp一下ok!库存足够,but 三天后一看傻眼了,a被另一个的预测冲掉了,而这个预测刚好一天前发给其他客户了,惨了?!被解雇,滚蛋了.这个比喻有些夸张.呵呵!应该来说并不是两个策略并存就一定有好处,需要看具体的需求.
3.mto和mts都是被生产定单控制管理
4.mts根据生产订单归集成本

 

实际上计划策略一般来说是针对产成品而言,下层物料是通过独立集中(mrp4视图)去控制,基本上不存在计划策略的问题,它根据最上层物料的计划策略和本身的独立集中来确定库存是专用还是共用。
您的方向大致是对的,但说法似有不妥,当然价值是选择的原则之一,但是周期不可忽视,一定就每个产成品做调研后决定


 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/13946941/viewspace-438931/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/13946941/viewspace-438931/

<think>好的,我现在需要帮用户解决在Odoo中实现仓库拣货调拨单的强制重置为草稿、强制删除功能,同时解决重置后自动从MTO(按订单生产)转变为MTS(按库存生产)的问题,还要限制MTO取消。用户之前已经询问过强制重置草稿的方法,现在又提到新的需求,需要结合之前的回答和站内的引用内容来优化解决方案。 首先,回顾之前的回答,用户已经知道如何通过自定义Python方法和XML视图添加按钮来重置拣货单状态。现在用户提到强制删除功能,这可能涉及到删除相关的库存移动和拣货单。但根据引用[1],拣货单的状态由其包含的库存移动决定,如果所有移动都是草稿或取消,拣货单才会变为草稿或取消。所以强制删除可能需要先确保所有关联的库存移动处于允许删除的状态,比如草稿或取消。 接下来是MTOMTS的问题。当重置拣货单为草稿时,用户希望自动将库存移动的MTO策略转为MTS。根据引用[2],库存移动可能在确认销售订单时自动创建,并拣货单关联。MTO通常销售订单相关,可能需要修改库存移动的route_id,从MTO路线改为MTS路线。需要检查库存移动的procure_method字段,将其从'make_to_order'改为'make_to_stock',并更新相关路线。 然后,限制MTO取消,即当库存移动使用MTO策略时,不允许取消。这需要在取消操作前进行检查,如果库存移动是MTO,则阻止取消。可能需要重写取消方法,添加条件判断。 用户提供的引用[1]中提到,拣货单的状态由库存移动的状态决定,部分可用状态会影响拣货单。因此,在重置或删除时,需要处理所有相关的库存移动,确保状态同步。此外,引用[2]提到库存移动可能在拣货单创建之前生成,因此强制删除可能需要同时处理拣货单和其关联的库存移动,尤其是自动生成的那些。 在实现强制删除功能时,需要考虑是否有其他关联记录,如stock.quant库存量化记录,可能需要清理。根据之前的回答,删除stock.quant记录可能必要,但需谨慎处理,避免数据不一致。 自动转换MTOMTS可能需要在重置草稿时,遍历所有相关的stock.move,修改它们的procure_method和route_id。同时,可能需要处理相关联的销售订单或采购订单,但用户可能希望仅调整库存策略,不影响订单本身。 限制MTO取消需要在取消操作前检查procure_method,如果是'make_to_order',则抛出错误或阻止操作。需要重写stock.move的取消方法,添加验证逻辑。 现在需要整合这些步骤,编写自定义方法,覆盖原有的重置和删除逻辑,确保状态变更、MTO转换和限制取消都被正确处理。同时,可能需要添加新的字段或约束,以支持这些功能。 另外,用户可能需要XML视图的调整,添加新的按钮或修改现有按钮的可见性,以反映新的功能。例如,强制删除按钮应只在特定状态下显示,或者在尝试取消MTO时弹出警告。 最后,测试这些修改是否影响其他业务流程,比如销售订单的自动生成库存移动,或者库存量的更新。确保在转换策略后,系统仍能正确执行补货规则,不会导致库存不一致。 总结,需要分步骤处理每个需求,确保每一步都正确处理关联模型和状态,同时保持数据一致性。可能需要多个自定义方法和视图调整,结合Odoo的原有工作流,确保功能的稳定性和可靠性。</think>### Odoo 仓库拣货调拨单深度控制实现方案 --- #### **一、强制重置草稿强制删除功能** ##### 1. **核心逻辑扩展** 根据引用[1],拣货单状态由库存移动决定。重置草稿需同时处理以下对象: ```python class StockPicking(models.Model): _inherit = 'stock.picking' def action_force_reset_draft(self): """强制重置草稿并清理关联数据""" for picking in self: # 检查拣货单状态是否允许操作 if picking.state not in ['done', 'cancel']: # 重置库存移动(强制清理预留数据) picking.move_lines.write({ 'state': 'draft', 'move_orig_ids': [(5, 0, 0)], # 断开上游关联 'procure_method': 'make_to_stock' # 强制转为MTS }) # 清理量化记录(解决库存预留残留问题) self.env['stock.quant'].search([ ('history_ids', 'in', picking.move_lines.ids) ]).sudo().unlink() # 更新拣货单状态 picking.write({'state': 'draft'}) def action_force_delete(self): """强制删除(需先重置为草稿)""" self.ensure_one() if self.state == 'draft': # 级联删除关联的库存移动 self.move_lines.unlink() return self.unlink() else: raise UserError(_("仅允许删除草稿状态单据")) ``` ##### 2. **XML视图增强** ```xml <record id="view_picking_form_enhanced" model="ir.ui.view"> <field name="name">stock.picking.form.enhanced</field> <field name="model">stock.picking</field> <field name="inherit_id" ref="stock.view_picking_form"/> <field name="arch" type="xml"> <xpath expr="//header" position="inside"> <button name="action_force_reset_draft" string="强制重置草稿" type="object" class="oe_highlight" states="confirmed,assigned,done"/> <button name="action_force_delete" string="强制删除" type="object" class="oe_red" states="draft"/> </xpath> </field> </record> ``` --- #### **二、MTOMTS自动处理** ##### 1. **库存移动策略转换** 根据引用[2]的自动创建逻辑,在重置时强制修改补货策略: ```python class StockMove(models.Model): _inherit = 'stock.move' def write(self, vals): # 当状态重置为草稿时自动转换MTOMTS if vals.get('state') == 'draft': vals.update({ 'procure_method': 'make_to_stock', 'route_ids': [(6, 0, self.env.ref('stock.route_warehouse0_mto').ids)] }) return super().write(vals) ``` ##### 2. **补货规则拦截** 防止MTO策略被重新激活: ```python class ProcurementRule(models.Model): _inherit = 'stock.rule' @api.model def _run_global_mto(self, product_id, location_id): # 拦截全局MTO规则触发 if self.env.context.get('disable_mto'): return False return super()._run_global_mto(product_id, location_id) ``` --- #### **三、MTO取消限制** ##### 1. **操作拦截逻辑** ```python class StockMove(models.Model): _inherit = 'stock.move' def action_cancel(self): # 检查是否允许取消MTO类型 for move in self: if move.procure_method == 'make_to_order' \ and not self.env.context.get('force_mto_cancel'): raise UserError(_("MTO类型库存移动禁止直接取消!")) return super().action_cancel() ``` ##### 2. **管理员覆盖机制** ```python # 添加带密钥的强制取消功能 def action_force_cancel_mto(self): return self.with_context(force_mto_cancel=True).action_cancel() ``` --- #### **四、系统级数据一致性保障** 1. **库存追溯修正** ```python class StockQuant(models.Model): _inherit = 'stock.quant' def _update_reserved_quantity(self): # 跳过已强制重置的移动记录 if self.env.context.get('skip_reserved_update'): return return super()._update_reserved_quantity() ``` 2. **工作流事件监听** ```python @api.model def _trigger_confirm_assign(self): # 过滤已被强制重置的库存移动 return self.filtered(lambda m: m.state != 'force_reset').\ _trigger_confirm_assign() ``` --- ### **实现效果说明** | 功能模块 | 技术实现 | 业务影响 | |-------------------|--------------------------------------------------------------------------|--------------------------------------------------------------------------| | 强制重置草稿 | 级联清理库存移动+量化记录+策略转换 | 解决历史数据残留问题,确保状态回退完整性[^1] | | MTO自动转MTS | 写入时拦截+路由规则覆盖 | 避免重置后再次触发MTO补货链[^2] | | MTO取消限制 | 操作拦截+上下文密钥机制 | 保护按单生产业务流程的完整性 | | 强制删除 | 状态前置检查+级联删除 | 彻底清理无效单据,防止数据库膨胀 | --- ### **注意事项** 1. 在 `stock.move` 模型中添加 `force_reset` 标记字段用于追溯异常操作 2. 建议配合 `ir.config_parameter` 增加开关控制功能启用状态 3. 对历史数据的处理建议使用队列任务异步执行(可集成 `queue_job` 模块) --- ### **扩展优化方向** 1. **操作审计追踪** 添加 `mail.thread` 继承记录状态变更日志 2. **批量处理增强** 开发树状视图批量操作按钮提升效率 3. **策略白名单** 通过产品分类设置允许转换MTO的例外情况 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值