【魅力开源】第2集:三个人每人一个想法会发生什么故事?关于Odoo的江湖

news2024/11/18 21:46:02

文章目录

  • 一. 关于权限控制:组织、角色、人员权限的说明
  • 二. 关于快速批量功能:有一些事情可以交给电脑来做
  • 三. 关于可以拖拉拽应用:技术模块
    • 3.1 可配置的MVC
    • 3.2 简单开发下附件模块也可用来作为企业的知识沉淀
    • 3.3 多语言支持:对于跨国业务的小伙伴,绝对是福音
    • 3.4 当然还有更多其他的功能
  • 四. 题外话
  • odoo中文社区野史-V2


如果你有一个苹果,我也有一个苹果,彼此交换后,你我还是一人一个苹果;但是如果你有一个想法,我有一个想法,彼此交换后,你我就都有两个想法,三个人呢?一百个人呢?

跟Odoo的初次邂逅,绝对称不上美好的回忆。
时间回到2018年4月11日。
第一次经手Odoo的工作是写报表,居然一写就写到2019年6月25日,我们第二位小伙伴加入。团队中一个人码代码的日子,1年2个月又14天,这是一件有趣而绝对称不上美好的事情。经历一年多对Odoo手摸手的学习,Odoo从controllers、models、report、views到JsonRPC各个板块也摸了个遍。

既然讲企业信息化,那接下来交代下后面故事的背景:

公司: 贸易性质公司 + 节能产品生产 + 工业维修再造三个业态,包括SFA(Sales force automation)/L2C(Leads To Cash)销售业态、MRO私域电商、永磁传动设备自主生产、工业维修再造、工厂数字化解决方案五个板块。
系统: ERP财务业务一体化系统(包括购销存财费/人事/生产等模块) + MRO私域电商系统 + CRM客户关系管理系统 + WMS仓储管理系统 + 生产报工系统
移动端: 企业微信(OA 系统)

在已上线ERP并稳定使用的情况下,不适宜启用Odoo的ERP功能。经过考虑:只把ERP作为订单中台,启用Base/Mail模块对核心ERP系统扩展并向前对接业务系统,是相对高效的模式。【这种模式适用性比较广,没过多破坏ERP的业务逻辑,大家都可以玩。当然这种基于ERP为订单中台的场景,后面将有章节讲到】
业务示意图:
在这里插入图片描述

下面再讲一些关于Odoo的事情:


一. 关于权限控制:组织、角色、人员权限的说明

一套相对完备的系统,需要有几个层级的控制,分别为满足组织隔离、同时至少应满足按角色设置:表单级权限控制、记录级权限控制、字段级权限控制。有部分做的较为优秀的系统,还可以实现按组织树关系对部门及员工数据进行共享及隔离处理(即自己可以查看本人数据,上级可以查看下级及本人数据,部门负责人可以查看本部门数据)。
在这里插入图片描述

二. 关于快速批量功能:有一些事情可以交给电脑来做

先来讲个场景,公司某部门有近200名业务人员,需要每天统计营销数据,并将销售报表每天定时发送给各个业务人员。

发200个邮件需要多长时间?测算一下,每个邮件30秒,数学不好,好像100分钟。

用Odoo框架来一段装下逼格的代码,花小半个小时,写个方法:先找一下数据,再循环一下,200个业务员的销售数据就出来了。接下来就可以泡壶茶等着报表发出来了。
当然,你也可以动动小指头去发送,只要个人愿意。
在大多数时候,效率与成本是比较难以平衡的一个事情。
经济管理上有个专业名称,叫“机会成本”,即所有的机会的获得都是以放弃其他机会来换取的,说得比较拗口。简单来讲,同一时间,你手上有AB两个机会,你选择A,那么你得放弃B;选择B同理。

看个228行代码实现自动邮件分发的例子:

class SDReportDaily(models.Model):
    """
    业务员销售日报表
    """

    def sd_report_daily(self):
        config_db = self.env['sync.server'].search([('name', '=', 'eas_db')])[0]
        oracle_db = cx_Oracle.connect(config_db.sync_user, config_db.sync_pwd, '%s:%s/%s' %
                                      (config_db.sync_server, config_db.sync_port, config_db.sync_db))
        cursor = oracle_db.cursor()
        try:
            cursor.execute(sql_data_salesman.format(current_date))  # 执行销售数据查询——查业务员
            record_salesman = cursor.fetchall()
            for bill in record_salesman:  #  这里循环一下,200个业务员就出来了
                self.sd_report_record(cursor, bill[0], bill[1], all_data=False, is_leader=False, is_origin=False)

	def sd_report_record(self, cursor, person, manager_email, all_data, is_leader, is_origin):
		pass

不是要挂附件吗,那在这里把附件“挂”上去吧

    def add_file_in_attachment(self, file_name, name):
        """
        生成附件
        :param file_name: 附件路径
        :param name: 附件名称
        :return: 附件对象
        """
        with open(file_name, "rb") as xlfile:
            byte_data = xlfile.read()
        attachment = self.env['ir.attachment'].create({'name': name,
                                                       'datas': base64.b64encode(byte_data),
                                                       'res_model': 'res.users',
                                                       'res_id': 2})
        return attachment

喝茶的时间200个邮件在这里就可以发出来了。

        def create_email(self, attachment_id, person, manager_email, current_time, body):
        """
        生成邮件
        :param attachment_id: 附件对象的id
        :param current_time:
        :return:
        """
        msg_body = u'%s<br/><br/> %s' % (body, '此电子邮件由系统自动发送.<br/>请不要直接回复邮件.')
        self.env['mail.mail'].create({
            'auto_delete': False,
            'notification': False,
            'state': 'outgoing',
            'mail_server_id': 1,
            'record_name': time.strftime('%Y-%m-%d %H-%M-%S'),
            'message_type': 'email',
            'reply_to': 'coco@qiye.com',
            'email_from': 'coco@qiye.com',
            'email_cc': 'coco@qiye.com',
            'email_to': manager_email,
            'attachment_ids': [(6, 0, [attachment_id])],
            'subject': '[%s]销售日报表%s' % (person, current_time),
            'body_html': msg_body,
        }).send()


三. 关于可以拖拉拽应用:技术模块

3.1 可配置的MVC

在这里插入图片描述

3.2 简单开发下附件模块也可用来作为企业的知识沉淀

在这里插入图片描述

3.3 多语言支持:对于跨国业务的小伙伴,绝对是福音

在这里插入图片描述

3.4 当然还有更多其他的功能

四. 题外话

2018年,一个人用Odoo10在写报表。Odoo10一个不太漂亮的系统,像主家庭主夫,不修边幅,但基本不会有明显BUG;

2019年,二个人用Odoo13写模块。功能靠修,泛善可陈;

2020年,三个人用Odoo13的写各种接口,对接客户、对接供应商、对接eCommerce;

2021年,四个人用Odoo14完成前端“业务中台”与ERP后端“订单中台”的大部分数据交互,也写一些BI的功能;

2022年,不到五个人,还是四个人。用着odoo16,继续做着码农,痛并快乐,,,,


odoo中文社区野史-V2

保定-粉刷匠: 开源ERP系统Odoo中国发展史
上海开源信息技术协会: 分享回顾 | Odoo的独特性及其“八卦”

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/159887.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

第五届“泰迪杯”数据分析技能赛 经验代码分享

第五届“泰迪杯”数据分析技能赛 经验/代码分享 品牌&#xff1a;“泰迪杯”数据分析技能赛 组织单位&#xff1a;泰迪杯数据分析技能赛组织委员会、广东泰迪智能科技股份有限公司、广东省工业与应用数学学会、人民邮电出版社、北京泰迪云智信息技术研究院、网宿科技股份有限…

内存管理详解

目录 一、C/C中内存分布 二、C语言的内存管理方式 三、C的内存管理方式 3.1 new/delete操作内置类型 3.2 new/delete操作自定义类型 3.3 operator new()和operator delete()函数 3.4 重载operator new()和operator delete() 四、new、delete的实现原理 4.1 内置类型 …

(02)Cartographer源码无死角解析-(50) 2D点云扫描匹配→相关性暴力匹配2:RealTimeCorrelativeScanMatcher2D

讲解关于slam一系列文章汇总链接:史上最全slam从零开始&#xff0c;针对于本栏目讲解(02)Cartographer源码无死角解析-链接如下: (02)Cartographer源码无死角解析- (00)目录_最新无死角讲解&#xff1a;https://blog.csdn.net/weixin_43013761/article/details/127350885 文末…

【论文速递】TPAMI2022 - 小样本分割的整体原型激活

【论文速递】TPAMI2022 - 小样本分割的整体原型激活 【论文原文】&#xff1a;Holistic Prototype Activation for Few-Shot Segmentation 获取地址&#xff1a;https://ieeexplore.ieee.org/document/9839487 CSDN下载&#xff1a;https://download.csdn.net/download/qq_36…

三十、RabbitMQ(1)

&#x1f33b;&#x1f33b; 目录一、 关于中间件的概述二、基于消息中间件的分布式系统的架构2.1 消息中间件应用的场景2.2 常见的消息中间件2.3 消息中间件的本质及设计2.4 消息中间件的核心组成部分2.5 小总结三、消息队列协议3.1 什么是协议3.2 网络协议的三要素3.3 AMQP 协…

JAVA 23种设计模式示例

目录 一.单例模式 二.工厂方法模式 三.抽象工厂模式 四.建造者模式 五.原型模式 六.享元模式 七.门面模式 八.适配器模式 九.装饰者模式 十.策略模式 十一.模板方法模式 十二.观察者模式 十三.责任链模式 十四.代理模式 十五.桥接模式 十六.组合模式 十七.命令…

openGauss数据库PostGIS 安装与使用

目录 概述 1.PostGIS 安装 1.1 GCC-7.3编译器安装 1.2PostGIS依赖库安装 1.3.安装Postgis 2.使用Extension 2.1创建PostGIS Extension 2.2使用Extension 2.3删除Extension 概述 PostGIS Extension是PostgreSQL的空间数据库扩展&#xff0c;提供如下空间信息服务功能&…

SpringBoot+VUE前后端分离项目学习笔记 - 【21 权限菜单 中】

1 新建了sys_dict表以及相应Dict类保存菜单menu的icon数据 2 新建了sys_role_menu表以及相应RoleMenu类保存前端Role页面传来的角色菜单ID的绑定关系 3 在MenuController里增加获取Dict里icon的方法 提供前端菜单页面显示 4 在RoleController增加Post接口&#xff0c;获取前台传…

66页3万字医疗行业大数据治理解决方案

【版权声明】本资料来源网络&#xff0c;知识分享&#xff0c;仅供个人学习&#xff0c;请勿商用。【侵删致歉】如有侵权请联系小编&#xff0c;将在收到信息后第一时间删除&#xff01;完整资料领取见文末&#xff0c;部分资料内容&#xff1a; 目 录 1. 1、医疗行业大数据管…

分享116个PHP源码,总有一款适合您

PHP源码 分享116个PHP源码&#xff0c;总有一款适合您 116个PHP源码链接&#xff1a;https://pan.baidu.com/s/1dsupZiZbKqvHPmlpIAgWqA?pwdg52q 提取码&#xff1a;g52q import os import shutil import time from time import sleepimport requests from bs4 import Bea…

C++11静态断言static_assert

C11静态断言static_assert一、运行时断言二、静态断言的需求三、静态断言四、单参数版本的静态断言一、运行时断言 断言&#xff08;assertion&#xff09;是一种编程中常用的手段。在通常情况下&#xff0c;断言就是将一个返回值总是需要为真的判别式放在语句中&#xff0c;用…

Oracle No-Fee Terms and Conditions (NFTC)到底有啥条款?

1995年Sun微系统公司推出Java至今已有28年的历史&#xff0c;由于厂商持续升级优化&#xff0c;使用场景广阔&#xff0c;生态完善&#xff0c;Java目前仍然保持着非常旺盛的生命力。 付费许可 2019年java更新了许可政策 https://www.oracle.com/java/technologies/javase/ja…

【一文速通】机器学习样本不均衡/数据分布不同怎么办?

样本不均衡是什么意思样本&#xff08;类别&#xff09;样本不平衡&#xff08;class-imbalance&#xff09;指的是分类任务中不同类别的训练样例数目差别很大的情况&#xff0c;一般地&#xff0c;样本类别比例&#xff08;Imbalance Ratio&#xff09;&#xff08;多数类vs少…

antd中Tree组件使用方法个人笔记

一、前言 最近在自己自学前端&#xff0c;不清楚学习路线&#xff0c;只能盯着公司的前端项目硬看。 公司的前端项目是react框架&#xff0c;Ant Design Pro。 之前刚把router.config.js的逻辑理顺&#xff0c;目前准备开发个简单的前端页面。 在此总结下antd中<Tree>…

【算法刷题 DAY04】剑指offer树3和队列与栈总结

JZ36 二叉搜索树与双向链表 描述 输入一棵二叉搜索树&#xff0c;将该二叉搜索树转换成一个排序的双向链表。如下图所示 注意: 1.要求不能创建任何新的结点&#xff0c;只能调整树中结点指针的指向。当转化完成以后&#xff0c;树中节点的左指针需要指向前驱&#xff0c;树中…

虹科新闻 | 虹科与weeve正式建立合作伙伴关系

近日&#xff0c;虹科与weeve正式建立合作伙伴关系&#xff0c;双方就工业应用自动化领域进行深入的交流与合作&#xff0c;未来将共同致力于为中国市场提供完整的物联网边缘服务解决方案&#xff0c;解决中国客户的物联网挑战。 虹科与weeve都表示十分期待这次的合作。“虹科…

day36【代码随想录】贪心算法之根据身高重建队列、用最少数量的箭引爆气球、无重叠区间

文章目录前言一、根据身高重建队列&#xff08;力扣406&#xff09;二、用最少数量的箭引爆气球&#xff08;力扣452&#xff09;三、无重叠区间&#xff08;力扣435&#xff09;前言 1、根据身高重建队列 2、用最少数量的箭引爆气球 3、无重叠区间 一、根据身高重建队列&…

魔改插线板,让电视控制周边设备开关机

一.我的需求 本人是一个极简主义风格的人&#xff0c;自从用了N1盒子刷了coreELEC 系统后&#xff0c;就不断的进行折腾&#xff0c;跟大家说下我的心路历程。 1.我家很少看电视&#xff0c;不想因为偶尔开一次电视就每个月交24块钱&#xff0c;所以把广电的机顶盒停掉了。 2.电…

TextView

1.简介 向用户显示文本的用户界面元素。 2.常见使用 2.1 设置文本内容 //xml 硬编码 <TextView android:text"文本"/> //xml 推荐放在string.xml,为了国际化考虑 <TextView android:text"string/app_name"/> //kotlin tv.text getStr…

零基础学员的shell脚本的写作思路详解

前言 这两天一直再批改学员的脚本作业&#xff0c;大多数学员写的很好&#xff0c;有的学员写的不太好。 还有一些还没有入门到学员不知道脚本该咋写。 不知道脚本怎么写的学员&#xff0c;绝大多数犯了一个错误&#xff1a;一上来就把脚本想的太复杂了。 我们今天单独聊聊这…