odoo14教程(制造订单与销售订单关联)

前言(MTO与MTS)

MTO:基于销售订单的生产,即销售订单需要多少就生产多少。在odoo13中,销售下单确认后就直接根据销售订单明细行生成制造订单。如果在增加销售订单,相同的产品也会重新创建一个制造订单。
MTS:基于库存的生产,即库存缺多少就生产多少。在odoo13中,只要制造订单没有开始安排生产,相同的产品会在原有制造订单上更新生产数量。
现实需求:
一般的中小企业无法做到真正的零库存,即只能以MTS方式生产,但同时又希望制造订单可以跟踪到销售订单。
在odoo14中,即使MTS,在一切配置正确的情况下,也是一个销售订单创建一个制造订单,和MTO几乎是一样的,而且还可以减去多余库存,因此在odoo14中,MTO是默认被归档的。异常场景(系统已经有了某产品的很多销售订单,但是没有配置正确的路线,导致系统无法创建制造订单,一旦配置正确,系统将会根据库存需求创建一个制造订单)。

制造订单与销售订单的关联

odoo14中,MTS几乎是达到了MTO的效果,唯一的缺点就是制造订单与销售订单断开了联系,源文档都是通过订货规则。
在这里插入图片描述

数据流

在这里插入图片描述
数据流转过程中,销售明细确认后对应生成了出库明细,如果库存缺货,stock.move将会根据订货规则创建制造订单,但是stock.move向订货规则流向时,只将产品、数量、位置等信息传递下去,没有将销售明细(sale_line_id)传递到生成,导致制造订单与销售订单关系断裂。

解决方案

在准备制造订单数据结构时,将sale_line_id、sale_id、partner_id等于销售订单相关的信息都可以传递到制造订单。
在这里插入图片描述

效果

在这里插入图片描述

在这里插入代码片
odoo.define('account.section_and_note_backend', function (require) {
// The goal of this file is to contain JS hacks related to allowing
// section and note on sale order and invoice.

// [UPDATED] now also allows configuring products on sale order.
// We create a custom widget because this is the cleanest way to do it:
// to be sure this custom code will only impact selected fields having the widget
// and not applied to any other existing ListRenderer.

"use strict";
var FieldChar = require('web.basic_fields').FieldChar;
var FieldOne2Many = require('web.relational_fields').FieldOne2Many;
var fieldRegistry = require('web.field_registry');
var ListFieldText = require('web.basic_fields').ListFieldText;
var ListRenderer = require('web.ListRenderer');

var SectionAndNoteListRenderer = ListRenderer.extend({
    /**
     * We want section and note to take the whole line (except handle and trash)
     * to look better and to hide the unnecessary fields.
     *
     * @override
     */
    _renderBodyCell: function (record, node, index, options) {
        var $cell = this._super.apply(this, arguments);

        var isSection = record.data.display_type === 'line_section';
        var isNote = record.data.display_type === 'line_note';

        if (isSection || isNote) {
            if (node.attrs.widget === "handle") {
                return $cell;
            } else if (node.attrs.name === "name") {
                var nbrColumns = this._getNumberOfCols();
                if (this.handleField) {
                    nbrColumns--;
                }
                if (this.addTrashIcon) {
                    nbrColumns--;
                }
                $cell.attr('colspan', nbrColumns);
            } else {
                $cell.removeClass('o_invisible_modifier');
                return $cell.addClass('o_hidden');
            }
        }

        return $cell;
    },
    /**
     * We add the o_is_{display_type} class to allow custom behaviour both in JS and CSS.
     *
     * @override
     */
    _renderRow: function (record, index) {
        var $row = this._super.apply(this, arguments);

        if (record.data.display_type) {
            $row.addClass('o_is_' + record.data.display_type);
        }

        return $row;
    },
    /**
     * We want to add .o_section_and_note_list_view on the table to have stronger CSS.
     *
     * @override
     * @private
     */
    _renderView: function () {
        var self = this;
        return this._super.apply(this, arguments).then(function () {
            self.$('.o_list_table').addClass('o_section_and_note_list_view');
        });
    }
});

var SectionAndNoteFieldOne2Many = FieldOne2Many.extend({
    /**
     * We want to use our custom renderer for the list.
     *
     * @override
     */
    _getRenderer: function () {
        if (this.view.arch.tag === 'tree') {
            return SectionAndNoteListRenderer;
        }
        return this._super.apply(this, arguments);
    },
});
fieldRegistry.add('section_and_note_one2many', SectionAndNoteFieldOne2Many);

return SectionAndNoteListRenderer;
});
### Odoo 自动生成订单的方法和配置 #### 配置分包路线补货规则 为了使Odoo能够根据销售订单自动生成采购或制造订单,需先配置好分包路线以及补货规则。当销售订单中的产品被确认时,如FURN_8888(办公台灯),Odoo会检查现有库存情况并基于设定好的逻辑生成对应的采购订单发送给指定的分包商[^1]。 对于需要进一步加工生产的部件A和B,系统依据物料清单(Bill of Materials, BOM)自动创建必要的生产任务;而一旦发现某些原材料短缺,同样遵循预设条件来自行发起额外的采购请求以补充所需物资。 ```python # Python伪代码展示自动化流程的一部分 if product_needs_subcontracting(product_id=FURN_8888): create_purchase_order_for_subcontractor() elif components_need_manufacturing(component_ids=[A, B]): generate_mo_based_on_bom() else: check_inventory_levels_and_replenish_if_needed() ``` #### 定义触发器启动动作 除了上述由业务需求驱动的过程外,还可以利用Odoo内置的功能——即通过定义特定情境下的触发机制来增强系统的响应能力。比如,在接收到新的客户订购信息之后立即执行诸如打印确认函之类的后续处理工作。此类行为可通过建立“自动操作”来进行定制化设置[^2]。 #### 创建询价单 针对那些并非直接来源于销售活动而是出于其他目的所必需的商品获取情形,可以借助于“采购→采购→询价单”的路径手动开启一个新的询价过程。值得注意的是,如果是由于内部计算得出的需求而导致该文档的存在,则会在其中标注出具体的关联记录以便追踪溯源[^4]。 #### 启用PDF报价生成功能 最后,为了让整个交易链条更加完善高效,建议激活位于销售模块下配置选项里的“PDF报价生成器”。这项服务允许企业在适当的时候快速产出专业的电子版商业文件供双方交流使用[^3]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值