从疫情开始迭代了近三年的OdooApp极速版重大更新:全面支持欧度WebSite模块低代码配置底部自定义TabBar标签导航栏,突破平台原生只允许绑定页面访问无法直接Button操作,且最多只能支持到五个的数量限制,Icon则支持直接使用FontAwesome图标字体大小可随意调,也可以用网络图片来表达选中态和默认态,还支持右上角Badge信息,同时接入全局标准的默认主题色和自定义色,至此odoo移动端和小程序的本土化应用又上了一个大台阶。
标签:odoo
odooiot居民身份证阅读器持续深度集成
b/s系统以前集成闭源硬件比较麻烦,当年做欧度地产管理系统时,需要在认购签约与财务收款环节快速刷卡验证客户二代身份证信息,根据当时的sdk能力,h5浏览器最佳的方案是模拟hid键盘输入,可以将读取到的所有文本信息字段用分隔符组合成长字符串输入到odoo前端window窗口并通过onkeydown事件获得并拆分成具体业务模型字段输出到编辑状态的表单视图上。
该方案优势是不用任何插件就可以兼容所有浏览器,缺点是焦点聚焦input输入框时前端还需要额外再跳转下一个分段输入处理,以及非文本字段如身份证照片二进制数据就无法获得,虽然理论上也可以通过编码成base64字符串一并处理,但是实际中会影响整个交互体验效率。
这些年由于IE浏览器的彻底没落,原来主流的ActiveX控件模式也跟着完全淘汰,各大商业硬件纷纷推出了HttpServer或WebSocket应用api接口替代,这不仅让桌面Web系统甚至移动App小程序都非常容易的通过网络来共享集成专业硬件服务。
Odoo与PostgreSQL互相成就之序列(ir.sequence)的实现
odoo序列standard模式其实是pg数据库sequence特性的无代码应用,分别在sql层封装了db序列的创建、删除、修改、查询和预测下一号码的基础能力。然后再根据实施灵活性增强了前后缀、长度不足补0、每个日期范围使用不同序列的层级关系等扩展功能。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 |
def _create_sequence(cr, seq_name, number_increment, number_next): """ Create a PostreSQL sequence. """ if number_increment == 0: raise UserError(_('Step must not be zero.')) sql = "CREATE SEQUENCE %s INCREMENT BY %%s START WITH %%s" % seq_name cr.execute(sql, (number_increment, number_next)) def _drop_sequences(cr, seq_names): """ Drop the PostreSQL sequences if they exist. """ names = sql.SQL(',').join(map(sql.Identifier, seq_names)) # RESTRICT is the default; it prevents dropping the sequence if an # object depends on it. cr.execute(sql.SQL("DROP SEQUENCE IF EXISTS {} RESTRICT").format(names)) def _alter_sequence(cr, seq_name, number_increment=None, number_next=None): """ Alter a PostreSQL sequence. """ if number_increment == 0: raise UserError(_("Step must not be zero.")) cr.execute("SELECT relname FROM pg_class WHERE relkind=%s AND relname=%s", ('S', seq_name)) if not cr.fetchone(): # sequence is not created yet, we're inside create() so ignore it, will be set later return statement = sql.SQL("ALTER SEQUENCE") + sql.Identifier(seq_name) params = [] if number_increment is not None: statement += sql.SQL("INCREMENT BY") + sql.Placeholder() params.append(number_increment) if number_next is not None: statement += sql.SQL("RESTART WITH") + sql.Placeholder() params.append(number_next) cr.execute(statement.join(' '), params) def _select_nextval(cr, seq_name): cr.execute("SELECT nextval(%s)", [seq_name]) return cr.fetchone() def _predict_nextval(self, seq_id): """Predict next value for PostgreSQL sequence without consuming it""" # Cannot use currval() as it requires prior call to nextval() seqname = 'ir_sequence_%s' % seq_id seqtable = sql.Identifier(seqname) query = sql.SQL("""SELECT last_value, (SELECT increment_by FROM pg_sequences WHERE sequencename = %s), is_called FROM {}""") params = [seqname] if self.env.cr._cnx.server_version < 100000: query = sql.SQL("SELECT last_value, increment_by, is_called FROM {}") params = [] self.env.cr.execute(query.format(seqtable), params) (last_value, increment_by, is_called) = self.env.cr.fetchone() if is_called: return last_value + increment_by # sequence has just been RESTARTed to return last_value next time return last_value |
odoo同时也额外用select for update nowait数据锁能力来互补实现了一套无间隔的no_gap模式,用来弥补纯sequence在欧度无处不在的事务应用中不会被连带回滚的特性,牺牲一些性能换取序列绝对连号用于某些特殊高要求的场景。如业财一体化应用中的会计分录凭证编号。
1 2 3 4 5 6 |
def _update_nogap(self, number_increment): number_next = self.number_next self._cr.execute("SELECT number_next FROM %s WHERE id=%%s FOR UPDATE NOWAIT" % self._table, [self.id]) self._cr.execute("UPDATE %s SET number_next=number_next+%%s WHERE id=%%s " % self._table, (number_increment, self.id)) self.invalidate_cache(['number_next'], [self.id]) return number_next |
odoopay在线支付网关对接聚合收款平台接口协议
odoo应用于c端相关的场景时,支付是其绕不开的一道坎,不管是pos、商城还是小程序或app,都需要接入payment网关模块来进行统一的聚合支付。
经历过的各种平台接口联调,https协议是标配,md5和sha系列散列摘要加密二选一,aes对称密钥加解密大部分都有,rsa非对称公私钥签名验算很常见,但最复杂难点莫过于odoo端私钥加密,平台端公钥解密。
python多个rsa相关库都不能完全互相替代,也没有现成的分段加解密方法需要自己实现,大部分库还不支持公私钥互相加解密,再加上平台端往往都是非python系统,经过多实例验证最终发现只有M2Crypto库可以完美配套与第三方平台的各种rsa加解密组合需求。
odoomes制造多产品变体分规格与总量计件报工
odooerp产品模板订单明细数量,结合生产工序工价进行的odoomes员工自助计件报工,同时支持扫菲计划报工与扫唛全量报工,所有特色工种都可以通过odooapp自由选择适合自己实际情况的报工方式
odoomes生产计划进度款式批次颜色尺码详情
odooerp款式合同订单根据供货批次生成相应的主生产计划与分批明细,odoomes系统实时报工计件模式下,手机odooapp小程序可以动态根据汇总产值来查看详细的计划进度执行情况
odooiot业务报表一键批量静默打印优化方案
odoo原生基于WebKit的报表引擎非常强大,但是打印过程体验非常不好,特别是pdf格式报表需要非常多的点击才能完成一次打印。本地下载目录留下不少文档不说,还依赖安装对应格式的阅读器,当然每台客户机也要安装配置好相应的打印机驱动。
1、本机操作系统打印机:这是最常用的方式,可优化引入PDF.js,让浏览器同窗口内通过odoo直接生成并在线预览pdf报表,确认没问题就一次点击按钮菜单或ctrl+p快捷键触发浏览器的系统打印功能。注意不同浏览器的静默打印开关方式都是不同的,比如Chrome的启动参数是–kiosk-printing。
2、服务器系统打印机:适合非云端的本地网络,如同时安装多种打印机还需要远程设备管理模块,技术报表模型增加设置服务端打印项,非缺省打印机还需从设备列表中显式指定。如标签、小票、照片、发票、工业等特种打印机还需根据实际情况扩展一些可灵活实施的参数。每当用户前端进行相关报表的批量打印操作时,后台直接将渲染结果发送到指定的打印机队列上实现静默打印。
3、IoT网关路由打印机:支持定制各种场景化需求实施,客户机、服务端、打印机都可以分别部署在不同的异构网络里。两端操作系统都不用额外安装配置相关打印机,odoo系统社区版智能iot模块可自动发现所有网关之下的蓝牙、RS232、USB、有线和无线网络共享打印机设备。再通过报表模块完善相关的物联网打印设置,就可以实现所有操作系统网络结构的主动、被动、消息模式以及APP小程序的静默打印功能。
odooiot硬件网关中控系统分布式解决方案
odoo物联网核心基础设施的IoT网关系统,也运行着同样优秀的开源社区版代码,只不过是按需极简模式启动,默认无数据库和只读文件系统快速安全适合低能耗全天候的应用场景。
odooiot每个分布式网关都实时上连odoo云服务器集群,下接各种传感器、扫码枪、摄像头、显示器、测量仪、收款机、扫描仪、考勤机、打印机等终端设备,硬件可用接口包括但不限于GPIO、USB、HDMI、串口、蓝牙、以太网、无线WIFI和5G蜂窝网络等。
iotgateway软件完全兼容odoo企业版iotbox解决方案里与树莓派相关的各种开源硬件和设备驱动程序,还可以支持运行在开放架构的路由器、电视盒及旧电脑主机上,更可以直接在工控机、工作站、触摸屏等上位机系统实现一体化集成。
如果说之前odooapp定位是软件领域全网通的话,那现在odooiot目标绝对是硬件方向全能王,再加上个成熟强大的odoo全业务后台做支撑,同个欧度技术栈云原生三位一体走遍天下都不怕了:)
odoo中台app矩阵之shop电子商城产品交易应用
odoo电商原生小程序app,无需安装任何后台模块,纯前端低代码实施兼容所有版本欧度网站商店系统,实现ERP相关产品一键实时发布至微信、头条、抖音、快手、百度、京东、支付宝、QQ等移动互联网平台。
所有类目商品均可支持手机扫码快速查询、原生综合模糊搜索、网站产品分类索引、标准分页列表内容展示、单品变体多规格属性值、多公司多币种阶梯价格表、实时在手和可用库存情况、多图片多视频及直播展示。
odoo中台app矩阵之cms流量播客内容发布应用
文字、图片、音频、视频、直播、地图等媒体区块内容都可以发布为全网通文章,具体细节内容还可以根据不同的平台进行差异化运营。每篇博文均支持封面、主副标题、发布时间、发布人、标签、说明、关键字等SEO元信息设置。
每个博客栏目都具有自己独立的面包屑路径和状态、标签、归档年月等筛选导航,更支持分页组件和其他栏目快速切换,还可以设置关于我们详情与分享、收藏、发布朋友圈的主题和自定义图标。
全部播客按最新发布时间排序的内容索引页面,可用无代码的方式实施页眉和页脚运营区块,可在博文的任意信息流段落位置,来控制全平台流量主的各种场景式广告组件。