从疫情开始迭代了近三年的OdooApp极速版重大更新:全面支持欧度WebSite模块低代码配置底部自定义TabBar标签导航栏,突破平台原生只允许绑定页面访问无法直接Button操作,且最多只能支持到五个的数量限制,Icon则支持直接使用FontAwesome图标字体大小可随意调,也可以用网络图片来表达选中态和默认态,还支持右上角Badge信息,同时接入全局标准的默认主题色和自定义色,至此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加解密组合需求。
odooiot业务报表一键批量静默打印优化方案
odoo原生基于WebKit的报表引擎非常强大,但是打印过程体验非常不好,特别是pdf格式报表需要非常多的点击才能完成一次打印。本地下载目录留下不少文档不说,还依赖安装对应格式的阅读器,当然每台客户机也要安装配置好相应的打印机驱动。
1、本机操作系统打印机:这是最常用的方式,可优化引入PDF.js,让浏览器同窗口内通过odoo直接生成并在线预览pdf报表,确认没问题就一次点击按钮菜单或ctrl+p快捷键触发浏览器的系统打印功能。注意不同浏览器的静默打印开关方式都是不同的,比如Chrome的启动参数是–kiosk-printing。
2、服务器系统打印机:适合非云端的本地网络,如同时安装多种打印机还需要远程设备管理模块,技术报表模型增加设置服务端打印项,非缺省打印机还需从设备列表中显式指定。如标签、小票、照片、发票、工业等特种打印机还需根据实际情况扩展一些可灵活实施的参数。每当用户前端进行相关报表的批量打印操作时,后台直接将渲染结果发送到指定的打印机队列上实现静默打印。
3、IoT网关路由打印机:支持定制各种场景化需求实施,客户机、服务端、打印机都可以分别部署在不同的异构网络里。两端操作系统都不用额外安装配置相关打印机,odoo系统社区版智能iot模块可自动发现所有网关之下的蓝牙、RS232、USB、有线和无线网络共享打印机设备。再通过报表模块完善相关的物联网打印设置,就可以实现所有操作系统网络结构的主动、被动、消息模式以及APP小程序的静默打印功能。
odoo中台app矩阵之shop电子商城产品交易应用
odoo电商原生小程序app,无需安装任何后台模块,纯前端低代码实施兼容所有版本欧度网站商店系统,实现ERP相关产品一键实时发布至微信、头条、抖音、快手、百度、京东、支付宝、QQ等移动互联网平台。
所有类目商品均可支持手机扫码快速查询、原生综合模糊搜索、网站产品分类索引、标准分页列表内容展示、单品变体多规格属性值、多公司多币种阶梯价格表、实时在手和可用库存情况、多图片多视频及直播展示。
Odoo uniCloud Serverless Computing Low Code App
odoo云端一体化快速开发迈出实验性的一小步,用的是serverless模式的uniCloud。欧度系统后台仅需配置服务空间的路由,odoo全网通前端小程序app通过低代码引擎解析后,即可直接操作阿里云和腾讯云提供的云数据库、云函数以及云存储。
接下来可以考虑将odoo动态生成的前端assets资源包自动同步到云存储里当cdn用,而所有静态的页面与素材则无缝对接云空间提供的前端网页托管服务。
odooapp移动分销电商供应链低成本解决方案
odoo前端原生saas多网站商城架构天然适合做多渠道分销,加上后端erp多公司供应链统一管理,多么完美且高起点的产销业财一体化基础平台,不同公司仅针对自己行业特色稍加改造一下,就可以快速试错的先运营起来。
odoo电商虽然可以简单开箱即用,但很多本地化的用户习惯和细节体验是需要逐步迭代改良的:
1、应用市场选择或二次开发定制适合的h5商城theme(包含皮肤、风格、样式等)模块,响应式布局设计,能在手机小屏幕设备上拥有良好的适配优化体验;
2、接入中国特色的社交账号快速注册与免密登录,如与微信开放平台(桌面)、公众平台(移动)的集成;
3、支持国内主流的支付方式,如微信和支付宝的pc扫码付、手机浏览器h5支付、app应用内jssdk支付等;
odooapp最极简的无界面原生壳方案可以完全不用额外安装欧度服务端模块,更不用app前端量身定制ui每次调整又要发布新版本,而是直接将odoo多级商城子域名链接编译打包发布成社交平台小程序,不同的分销渠道可以独立申请自己主体资质的小程序名称和品牌头像,也可以共用一个主域名平台小程序但用不同的专属二维码分发。最奢侈的甚至可以为每一个spu/sku商品都规划一个独立的单品百科知识及在线网购小程序,并全网通发布至所有平台进行超级移动seo。
odooapp产品原生层则需要统一对接每个平台的特有账户体系和小程序内快捷支付,并向所绑定的odoo商城默认路由链接或社交分享路径额外提供code、token等用户身份凭证相关校验参数以实现odoo后台静默授权免密登录,而壳层内的odoo website h5模板页面在用户注册和支付环节时,也能通过标准jssdk判断自身所处环境来调用专用jsapi进行资料获取授权、订单支付触发、交易群聊分享等原生能力。
odooapp物联网智能硬件iot树莓派开发板
odoo基础硬件分别为树莓派的Pico和Zero开发板,前者用于实时系统微控制器场景,后者则运行odoo离线客户端与odoo服务器保持天然一体化互动。
odoo iot版本可以简单理解成是odoo社区版的最小精简版,仅仅自带几个和硬件相关的模块,非常轻量级,但这已是开源硬件Raspberry Pi与开源软件Odoo强强联合设计开发的一个超高起点。
odoo云平台有了,odooapp也做了,今年的目标就是全面进军odoo硬件,补足最后的短板,形成三位一体全是用大odoo技术栈构建的一统天下能力。
odooapp纯html5网页套壳打包全网发布应用
odooapp的外链能力,可以在应用内打开第三方非odoo网站,且每个子页链接都可以使用app或小程序的原生分享、群发、收藏等功能,极大丰富了传统h5网页在移动端上的分发效果。
html5纯页面角度,通过外套app层混合打包成全网通应用发布至所有平台,并获得相关系统的开放能力,可以最低成本最快速度一劳永逸的抢占各种自然流量入口,以实现其全网存在的最大化价值。
odooapp还提供web sdk开发库,可以让外链的页面嵌入sdk续而调用所提供的javascript api接口返回或跳转到指定的原生页面,这机制也完善了内外链之间的生态闭环切换流程。