如何解决Odoo 14销售模块报价单转订单序列跳号问题
Odoo 14 销售订单序列跳号问题解决方案
问题根因
- Odoo 底层的
ir.sequence(序列规则)默认开启了事务防护特性:只要序列被调用过一次,哪怕后续业务事务回滚,被调用过的编号也会被标记为已消耗,不会回流到序号池 - 报价单转销售订单的流程中,大概率存在前置校验逻辑:比如库存校验、自定义字段校验、审批流校验等,如果校验逻辑的执行在序列调用之后,校验失败触发事务回滚时,已经调用过的SO编号就会被浪费,下一次转单就会出现跳号
分步解决方法
1. 调整序列基础配置
- 开启Odoo开发者模式,依次进入
设置→技术→序列与标识符→序列 - 找到你自定义的销售订单(SO)序列规则,进入编辑页
- 取消勾选预分配下一个编号选项,保存配置即可解决大部分非开发场景的跳号问题
2. 优化自定义开发的代码逻辑(二开场景适用)
如果存在自定义的报价单转单逻辑,调整序列调用的时机,确保所有校验通过后再调用序列生成编号:
# 错误写法:先获取编号再做校验,校验失败就会浪费编号 so_seq = self.env['ir.sequence'].next_by_code('sale.order') if not self._check_quote_available(): raise ValidationError("报价单校验不通过") # 正确写法:所有校验通过后再调用序列生成编号 if not self._check_quote_available(): raise ValidationError("报价单校验不通过") so_seq = self.env['ir.sequence'].next_by_code('sale.order')
3. 排查第三方模块干扰
检查是否安装了销售审批流、库存自动预留、自定义编号类的第三方模块,这类模块通常会在销售订单正式创建前预调用序列生成编号做前置逻辑,关闭对应模块的预生成编号配置即可。
4. 临时修复已跳号的编号
如果需要补回已经跳过去的编号,进入销售订单序列编辑页,手动将下一个编号修改为缺失的连续数值即可,注意不要和已存在的销售订单编号重复。
内容的提问来源于stack exchange,提问作者Sakthi Priya
相关产品推荐
相关产品推荐

