在业务操作中,经常会遇到需要生成全局唯一序列号数据的情况,比如订单号、报价单号等。为了确保数据的唯一性和准确性,通常我们会使用Redis或其他分布式锁机制来实现。然而,很多人可能不知道,odoo框架本身提供了一个原生的model,可以实现生成自定义的唯一序列号,即基于odoo原生的ir.sequence实现。
一、实施步骤
首先需要定义一个model 并新建字段序列号字段student_no
方法一:页面新增唯一序列号配置
使用admin账户登录系统,激活开发者模式,打开设置,找到:技术——菜单栏
点击序号,进入唯一序列号配置页
点击创建,进入序号表单页,填写名称、执行序列代码、以及填写序号的前缀、后缀等等
方法二:通过后端代码实现odoo唯一序列号
首先,新建data目录,并新增ir_sequence_data.xml文件
filed部分字段说明(配置属性字段有很多,示例只展示常用设置属性):
- name: 序号名称
- code: 获取序号的code,需要全局唯一
- prefix: 前缀,可以是固定的常量 也可以是包含固定格式的变量以及组合参数等等
- padding :序号流水数的长度,也就是定义序号可以变化的长度
- number_increment: 序号的每次递增的大小,
- number_next:下一个序列号的数字
- active: 序号生成状态,true 开启 false 关闭
然后需要新建对应model以及在该model内部重写create的方法,并将序列号code获取的值赋值给序号字段
最后在mainfest文件中加入xml文件的引入路径,使其正常生效
启动项目,并升级该模块,然后去设置-技术-序列和标识符-序号列表找到刚刚创建的序号生成规则记录
点击任务可以进入序号表单页,可以进行编辑序号规则属性以及调整下一个序号值
以上就是odoo实现序号规则的2种通用方式。最终的数据效果如下图:
对于开发来说,通常使用第二种方式执行,比较灵活和方便。
无论采用哪种方式实现自定义序号规则,最终都会在ir_sequence表中生成序号记录数据,只有生成了序号记录,才代表创建序号规则成功。
二、总结
综上所述,odoo的唯一序号规则具有以下优势:
- 唯一性:每个序号都是唯一的,可以确保在系统中不会出现重复的序列号,方便对不同的单据或文件进行识别和管理。
- 自动化:使用内部唯一序号生成器可以自动生成序列号,减少了手动编号的工作量,也避免了因手动编号出现的错误。
- 可扩展性:内部唯一序号生成器可以随着企业的发展而扩展,可以适应不同规模的企业需求。
- 方便性:生成的序列号可以在不同的单据或文件中重复使用,不需要重新编号,方便了单据或文件的管理和跟踪。
- 可读性:内部唯一序号生成器生成的序列号通常具有一定的规律性和可读性,方便人员识别和理解。
- 可视化界面友好:odoo序号生成提供了可视化的界面,用户可以通过简单的操作来创建、编辑、删除序号规则,方便易用。
三、其他问题解答
Odoo原生的自定义唯一序号生成规则使用起来特别方便和简单,在高并发下也能很好满足数据的唯一性,能够快速生成业务系统的数据编号,但是初步使用者总会遇到很多问题,下面就简单分享2个自己遇到的业务难题,让大家在工作学习中提前掌握。
问题一:设置定时自动重新计数的编号
如果我们想要生成每天或者每个月自动重新计数的编号,按照上面的序号规则是无法满足的,但是我们可以通过odoo定时任务去每天或者每个月更新一次序号规则中的属性字段number_next_actual(下一个序号编号),这样每天都会从1开始计数,可以满足业务需要。
问题二:设置定制化的业务编号
如果我们业务中的业务编号比较复杂不仅仅是要年月日去合成编号,还需要结合业务字段去生成更加定制化的业务编号,这种情况下就需要通过代码去生成更加复杂的前缀或者后缀去拼接序号并通过代码创建序号规则,代码如下:
上面的代码实现了,根据不同性别的学生分别进行编号并获取不同前缀的学生编号字段。
作者:陈润平|高级后端开发工程师
本次分享就到这里啦,更多odoo小知识欢迎关注“神州数码云基地”公众号,回复“odoo”进入社群交流
版权声明:文章由神州数码武汉云基地团队实践整理输出,转载请注明出处。